Как запретить сотрудникам или администраторам редактировать суперпользователей

Я работаю над распределением прав и согласно моей структуре модели пользователя, сотрудники и администраторы могут редактировать is_staff и is_admin для других пользователей, а не для себя. Но с такими полномочиями они могут редактировать эти були и для суперпользователей, на что я не даю им разрешения! Итак, как я могу позволить сотрудникам и администраторам редактировать эти були для других, кроме суперпользователей и себя? Или не позволять сотрудникам и администраторам получать разрешение на вмешательство в любые атрибуты суперпользователей

admin

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    is_superuser = request.user.is_superuser
    is_admin = request.user.is_admin
    disabled_fields = set()

    if (
        not is_superuser
        and obj is not None
        and obj == request.user
    ):
        disabled_fields |= {
            'staff',
            'admin',
            'user_permissions',
        }

    for f in disabled_fields:
        if f in form.base_fields:
            form.base_fields[f].disabled = True

    return form

У меня есть еще одно предложение, вы можете использовать групповое разрешение Django Group

создайте определенное групповое разрешение и добавьте в него любого пользователя, которого вы хотите

Вы можете управлять булевым полем is_superuser с помощью формы для предотвращения того, чтобы не-суперпользователи не могли изменять флаг is_superuser любого суперпользователя и управлять изменениями самого пользователя с помощью метода разрешения. Также вы можете использовать метод modeladmin get_readonly_fields() для частичного отключения полей.

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    is_superuser = request.user.is_superuser
    disabled_fields = set()
    # Prevent non-superusers from changing user's superuser boolean field
    if not is_superuser:
        disabled_fields |= {
            'is_superuser',
        }
    for f in disabled_fields:
        if f in form.base_fields:
            form.base_fields[f].disabled = True
    return form

def has_add_permission(self, request):
    opts = self.opts
    codename = get_permission_codename('add', opts)
    user_has_add = request.user.has_perm("%s.%s" % (opts.app_label, codename))
    if user_has_add and self.is_user_not_allowed(request.user, None):
        return False
    return user_has_add

def has_change_permission(self, request, obj=None):
    opts = self.opts
    codename = get_permission_codename('change', opts)
    user_has_change = request.user.has_perm("%s.%s" % (opts.app_label, codename))
    if user_has_change and obj is not None and self.is_user_not_allowed(request.user, obj):
        return False
    return user_has_change


def is_user_not_allowed(self, user, obj=None):
    if not user.is_superuser and obj is not None and obj == user:
        # Prevent non-superusers from editing their own permissions
        return True
    return False
Вернуться на верх