2012-06-01 4 views
7

На сайте Django, на котором я работаю, есть возможность для пользователей зарегистрироваться для учетной записи. Чтобы предоставить им некоторые функции редактирования, я использую встроенный администратор Django. Однако у меня возникла проблема: после того, как пользователь зарегистрировался, у них нет прав в администраторе Django, даже не на просмотр разрешений. Таким образом, мой вопрос: как мне, в коде, назначить права администратора для соответствующих моделей, таким же образом я могу назначить их вручную в разделе «Разрешения пользователя» при редактировании пользователя в администраторе? Я уже пробовал с usualhas_xxx_permissions() с использованием пользовательских классов ModelAdmin, но это не сработало. Поэтому я предполагаю, что я забыл что-то очевидное. Есть идеи?Настройка разрешений администратора Django программно

+0

Релевантные ответы [здесь] (http://stackoverflow.com/questions/10131271/invalid-literal-error-when-adding-a-user-permission-to-a-django-user-object/10131510#10131510) и [здесь] (http://stackoverflow.com/questions/10252332/how-to-add-permissions-in-django-to-models-and-test-it-using-thehell/10252613#10252613) , – dgel

+0

Perfect - указал мне в правильном направлении. Большое спасибо! – Timo

ответ

5

Для ваших целей, вероятно, было бы намного проще и эффективнее и назначать всех новых пользователей к определенной группе, а затем дать этой группе все разрешения потребности пользователей. Любой член группы также наследует эти разрешения.

Вы можете создать группу и назначить ей права администратора. Затем вам просто нужно добавить к вашему регистрационному коду что-то вроде следующего.

try: 
    group = Group.objects.get(name='The User Group') 
except Group.DoesNotExist: 
    # group should exist, but this is just for safety's sake, it case the improbable should happen 
    pass 
else: 
    user.groups.add(group) 
+0

Я полагаю, что это можно сделать так, но применение разрешений непосредственно к пользователям кажется мне «приятнее» (хорошо, возможно, просто вопрос вкуса). Но я буду помнить об этом в других случаях. – Timo

+0

@ Тимо Я точно такой же; хотя теоретически группа более изящна, еще одна вещь - убедиться, что она на месте. Я думаю, что, когда мне нужно больше заниматься этим, я переключусь на группы, но пока я буду придерживаться прямых перм. –

+0

Собственно, примеры кода dgel (связанные с [ниже] (http://stackoverflow.com/a/10863809/61938)) изменили мое мнение. Группы это! –

3

dgel «s ответ указал мне в направлении, которое приведет к рабочему раствору для меня. По сути, то, что он, кажется, предлагает:

  1. Извлечение ContentType для модели вы хотите установить разрешение. В этом контексте тип контента является объектом, который содержит information about a Django model.
  2. Создайте объект Permission, состоящий из типа содержимого и действия, которое вы хотите разрешить внутри администратора, используя Permission.objects.get(). Единственная трудность здесь заключается в определении параметра codename, который для прав администратора состоит из действия («добавить», «изменить» или «удалить»), подчеркивания и имени модели. Поэтому, если у вас есть модель под названием Foo, и вы хотите создать для нее все разрешения, вам понадобятся 3 разрешения, каждый из которых имеет тип контента вашей модели Foo плюс кодовые названия add_foo, change_foo и delete_foo.
  3. Назначьте эти разрешения с помощью user.user_permissions.add(permission).

Наверх к ответам на dgel для codeexamples. Глядя на дамп данных приложения auth (manage.py dumpdata auth) существующей базы данных Django, я также получил представление о внутренней работе разрешений.

1

По Джанго 1.6:

Каждый пользователь имеет много-ко-многим поле user_permissions для разрешения - вы можете добавить разрешения на это:

your_user.user_permissions.add(permission) 

v1.6 Docs:

0

Я отвечу на ваш вопрос точно, так как я нашел это вопрос с Google. Я покажу, что я делаю в Django 1.9 с группами, а затем покажу, как это сделать для пользователя.

из django.contrib.auth.models импорта группы, разрешение группу, __ = Group.objects.get_or_create (имя = 'my_group')

permissions = Permission.objects.all() 
for p in permissions: 
    group.permissions.add(p) 
group.save() 

Это довольно легко адаптироваться к пользователю:

from django.contrib.auth.models import Permission 
permissions = Permission.objects.all() 
for p in permissions: 
    youruser.user_permissions.add(p) 
youruser.save() 

Я предпочитаю группу, потому что вы можете добавлять разрешения в будущем и можете просто добавить в группу, а не повторять всех пользователей.