Позволить пользователю добавлять пользователя, но не изменять его в 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 []

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

Вернуться на верх