如何防止Django管理员中的超级用户删除?

时间:2013-08-28 11:39:11

标签: python django django-admin

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

由于

2 个答案:

答案 0 :(得分:8)

请勿使用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。

答案 1 :(得分:1)

您可以尝试覆盖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)