Позволить пользователю добавлять пользователя, но не изменять его в Django admin, возможно ли это, и если да, то как?
Я очень новичок в Django.
В моем Django 4.0 невозможно позволить персоналу "добавить пользователя", но не "изменить пользователя" в интерфейсе администратора. Также либо персонал может и добавлять, и изменять пользователя, либо не может делать ничего из этого. Я хочу, чтобы сотрудники могли добавлять пользователей, но не могли изменять их данные. Это пользовательская модель пользователя.
Я хочу сделать закрытую систему, где пользователи регистрируются только админами. Но данные пользователя не должны быть изменены админами. И когда админ регистрирует нового пользователя, пользователю посылается проверочный email, так что пользователь должен подтвердить свой email, прежде чем он/она сможет им воспользоваться.
Можно ли разрешить персоналу не изменять пользователя в интерфейсе администратора, но при этом иметь возможность добавлять пользователя?
А отправка электронной почты новому пользователю при добавлении его в Django admin, возможно ли это сделать?
Я попробовал следующее:
def has_change_permission(self, request, obj=None):
if not request.user.is_superuser:
return False
else:
return True
def has_add_permission(self, request):
return True
Но это не работает. Я пытался сделать все поля "только для просмотра" с помощью get_readonly_fields, но тогда все они остаются только для просмотра, когда вы пытаетесь добавить пользователя или изменить пользователя. Я пробовал get_form, но это вообще не работает:
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
is_superuser = request.user.is_superuser
readonly_fields = set() # type: Set[str]
if not is_superuser:
readonly_fields |= {
'email',
'is_superuser',
'first_name',
'last_name,',
'permissions',
}
for f in readonly_fields:
if f in form.base_fields:
form.base_fields[f].disabled = True
return form
Выполните эти методы:
def has_change_permission(self, request, obj=None):
return False
def has_add_permission(self, request):
return True
Или пометить все поля как доступные для чтения только во время изменения:
def get_readonly_fields(self, request, obj=None):
if obj:
# Updating an instance
return self.fields
# Creating an instance
return []
Определите метод сохранения вашей пользовательской модели или используйте сигнал для отправки электронного письма при создании пользователя, прочитайте документацию по отправке электронных писем.