【问题标题】:How to prevent super user deletion in Django admin?如何防止在 Django admin 中删除超级用户?
【发布时间】:2013-08-28 11:39:11
【问题描述】:

在 django admin 中,我有 4 个用户和一个超级用户。我有员工身份的用户访问受限,无法删除/查看/编辑用户,但管理员对所有其他用户和模型拥有权限。我确实希望超级用户能够访问用户数据并编辑/修改/删除它们,但我不希望超级用户能够删除自己。目前超级用户可以删除自己。有没有办法在 django 中自己禁用超级用户删除?任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 如果您检测到超级用户试图删除自己,您可以覆盖您的 User 模型的管理员并引发异常。

标签: python django django-admin


【解决方案1】:

不要使用 has_delete_permission() 覆盖,因为当您从更改列表执行删除操作时,它不会在每个对象上调用。

使用信号来做到这一点。将此添加到任何 models.py

from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied

@receiver(pre_delete, sender=User)
def delete_user(sender, instance, **kwargs):
    if instance.is_superuser:
        raise PermissionDenied

这种方法的唯一缺点是没有人可以删除任何超级用户。您必须先将用户属性“is_superuser”设置为 False,然后才能将其删除。

【讨论】:

  • 是的,谢谢,它对我来说很好......如果超级用户试图删除自己,最后它会显示 403 禁止。
【解决方案2】:

您可以尝试覆盖UserAdmin,这样它就不允许删除here 记录的内容:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):

    def has_delete_permission(self, request, obj=None):
       if obj is None:
           return True
       else:
           return not obj.is_superuser

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

【讨论】:

  • 看来Django只调用这个函数来判断是否显示“删除”按钮。当您从列表中选择用户并一次删除多个用户时,将使用obj=None 调用该函数。您可以通过在obj=None 时返回False 来禁止从列表中删除,或者隐藏覆盖queryset 函数的超级用户(Django 1.6 中的get_queryset)。
  • 是的,这就是我的意思;)
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多