Django требует, чтобы пользователи с разрешением Can add user
также имели разрешение Can change user
. Цитируя documentation:
Также обратите внимание: если вы хотите, чтобы ваш собственный счет, чтобы пользователь мог создавать пользователей с помощью администратора сайта Django, вы должны дать себе разрешение на добавление пользователей и изменение пользователей (т.е. «Добавить пользователя» и «Изменить пользователя»). Если ваша учетная запись имеет разрешение добавлять пользователей, но не изменять их, вы не сможете добавлять пользователей. Зачем? Потому что, если у вас есть разрешение на добавление пользователей, у вас есть возможность создавать суперпользователей, что в свою очередь может изменить других пользователей. Поэтому Django требует добавления и изменения разрешений в качестве небольшой меры безопасности.
Однако возможно ограничить набор разрешений, доступных для данного пользователя, путем изменения ModelAdmin
(или его формы). Вот an answer, показывающий, как переопределить UserAdmin
.
Я считаю, что ваш новый ModelAdmin
бы: а) отфильтровать пользователей, которые имеют больше прав, чем вы (так что вы не можете удалить разрешения от них); б) изменить форму пользователя изменения, чтобы вы не могли установить поле superuser
, и разрешения, которые вы не можете назначить, исключены из списка (или вообще отключите весь список), но я не знаю, что вам действительно нужно, не так ли? Создание пользователя без каких-либо разрешений не будет очень полезным IMO).
Обновление: Вот что я нашел до сих пор. Должен удовлетворять всем поставленным выше целям, кроме проблемы фильтрации разрешений (он ведет себя так, как вы просили в вопросе - отрицать приведение любых прав пользователей, которые не имеют права). Вы можете изменить его, чтобы лучше соответствовать вашим потребностям (например, замените .is_superuser
любой логикой, которую вы хотите разрешить/запретить изменение разрешений).
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
def queryset(self,request):
qs = admin.ModelAdmin.queryset(self,request)
if request.user.is_superuser:
return qs
# Only allow viewing/editing users who are not superusers
return qs.filter(is_superuser=False)
def get_readonly_fields(self, request, obj=None):
# Deny editing groups, permissions and the superuser status
return() if request.user.is_superuser else ('is_superuser', 'groups', 'user_permissions')
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Примечание: Я хотел бы дать вам более полный ответ, но у меня возникли проблемы с поиском правильной настройки «UserAdmin» или его форм. Я вернусь к этому позже, если найду что-нибудь полезное. (PS [это] (https://docs.djangoproject.com/en/1.0/ref/contrib/admin/#adding-custom-validation-to-the-admin) должно быть хорошей отправной точкой) – mgibsonbr
Спасибо _very_ до сих пор! Думаю, много помогает! –