Как запретить сотрудникам или администраторам редактировать суперпользователей
Я работаю над распределением прав и согласно моей структуре модели пользователя, сотрудники и администраторы могут редактировать 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