На сайте Django, на котором я работаю, есть возможность для пользователей зарегистрироваться для учетной записи. Чтобы предоставить им некоторые функции редактирования, я использую встроенный администратор Django. Однако у меня возникла проблема: после того, как пользователь зарегистрировался, у них нет прав в администраторе Django, даже не на просмотр разрешений. Таким образом, мой вопрос: как мне, в коде, назначить права администратора для соответствующих моделей, таким же образом я могу назначить их вручную в разделе «Разрешения пользователя» при редактировании пользователя в администраторе? Я уже пробовал с usualhas_xxx_permissions()
с использованием пользовательских классов ModelAdmin
, но это не сработало. Поэтому я предполагаю, что я забыл что-то очевидное. Есть идеи?Настройка разрешений администратора Django программно
ответ
https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions-and-authorization
new_user.user_permissions.add(permission1, permission2, etc...)
Только 'user.user_permissions.add()' работал для меня. Django 1.4 поднял объект AttributeError: 'User' не имеет атрибутов 'permissions'', если я попробовал просто '' user.permissions.add() ''. – tar
Для ваших целей, вероятно, было бы намного проще и эффективнее и назначать всех новых пользователей к определенной группе, а затем дать этой группе все разрешения потребности пользователей. Любой член группы также наследует эти разрешения.
Вы можете создать группу и назначить ей права администратора. Затем вам просто нужно добавить к вашему регистрационному коду что-то вроде следующего.
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)
Я полагаю, что это можно сделать так, но применение разрешений непосредственно к пользователям кажется мне «приятнее» (хорошо, возможно, просто вопрос вкуса). Но я буду помнить об этом в других случаях. – Timo
@ Тимо Я точно такой же; хотя теоретически группа более изящна, еще одна вещь - убедиться, что она на месте. Я думаю, что, когда мне нужно больше заниматься этим, я переключусь на группы, но пока я буду придерживаться прямых перм. –
Собственно, примеры кода dgel (связанные с [ниже] (http://stackoverflow.com/a/10863809/61938)) изменили мое мнение. Группы это! –
dgel «s ответ указал мне в направлении, которое приведет к рабочему раствору для меня. По сути, то, что он, кажется, предлагает:
- Извлечение ContentType для модели вы хотите установить разрешение. В этом контексте тип контента является объектом, который содержит information about a Django model.
- Создайте объект Permission, состоящий из типа содержимого и действия, которое вы хотите разрешить внутри администратора, используя
Permission.objects.get()
. Единственная трудность здесь заключается в определении параметраcodename
, который для прав администратора состоит из действия («добавить», «изменить» или «удалить»), подчеркивания и имени модели. Поэтому, если у вас есть модель под названиемFoo
, и вы хотите создать для нее все разрешения, вам понадобятся 3 разрешения, каждый из которых имеет тип контента вашей моделиFoo
плюс кодовые названияadd_foo
,change_foo
иdelete_foo
. - Назначьте эти разрешения с помощью
user.user_permissions.add(permission)
.
Наверх к ответам на dgel для codeexamples. Глядя на дамп данных приложения auth (manage.py dumpdata auth
) существующей базы данных Django, я также получил представление о внутренней работе разрешений.
По Джанго 1.6:
Каждый пользователь имеет много-ко-многим поле user_permissions
для разрешения - вы можете добавить разрешения на это:
your_user.user_permissions.add(permission)
v1.6 Docs:
- Django.contrib.auth API (показывает пользователя, группы и объекты разрешений)
- Auth default permissions (показывает, как очистить, добавить, удалить)
Я отвечу на ваш вопрос точно, так как я нашел это вопрос с 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()
Я предпочитаю группу, потому что вы можете добавлять разрешения в будущем и можете просто добавить в группу, а не повторять всех пользователей.
Релевантные ответы [здесь] (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
Perfect - указал мне в правильном направлении. Большое спасибо! – Timo