【问题标题】:Django admin - Disable user deletionDjango admin - 禁用用户删除
【发布时间】:2012-09-10 15:33:48
【问题描述】:

我有一个 django 应用程序,我想在管理员中禁用用户删除。我试图禁用操作并将删除权限设置为 false。但它们都不起作用。

from django.contrib.auth.models import User

class UserProfileAdmin(UserAdmin):
    actions = None

    def has_delete_permission(self, request):
        return False

    def get_actions(self, request):
        actions = super(UserProfileAdmin, self).get_actions(request)
        if 'delete_selected' in actions:
            del actions['delete_selected']
        return actions

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

但是当我使用 UserAdmin 向用户信息添加内联时,它工作正常。所以请建议我一种在 django admin 中禁用用户删除的方法。提前致谢。

【问题讨论】:

  • 您要覆盖has_add_permission 以禁用删除?此外,最好全局禁用删除操作并明确添加到需要的地方
  • 对不起。实际上是has_delete_permission。我在这里犯了一个错误。关于禁用删除操作,站点范围是一个好主意。但是当我们打开一个用户条目时,在提交行(保存按钮行)中会有一个删除选项。如何禁用它?

标签: django django-admin


【解决方案1】:

覆盖ModelAdmin.has_delete_permission 应该可以解决问题,您的调用签名不正确,它缺少obj 参数

class UserProfileAdmin(UserAdmin):
    def has_delete_permission(self, request, obj=None): # note the obj=None
        return False

此外,只需 return False 阻止包括管理员在内的所有员工删除 Django Admin 中的项目,您可能只需调整 User/Group 权限以防止那些您不希望他们删除 User() 的员工,通过删除他们的delete_userprofiledelete_user 权限。

【讨论】:

  • 我想禁用 super_user 本身的删除权限。 has_delete_permission 也没有显示任何效果。
  • @arulmr 很奇怪,您是否正确注册了UserProfileAdmin 并且没有覆盖管理模板?尝试在has_delete_permission() 中的return 子句之前放置一个import pdb; pdb.set_trace(),以确保它被调用。
  • 我在下面给出我的代码:from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin class UserProfileAdmin(UserAdmin): def has_delete_permission(self, request, obj=None): import pdb; pdb.set_trace(); return False admin.site.unregister(User) admin.site.register(User, UserProfileAdmin) 但是 pdb 没有被调用。这里有什么错误?我认为此评论中的代码格式不会很好。提前致谢。
  • @arulmr 我不知道,您需要找出实际的ModelAdmin 和管理模板,用于了解为什么User 更改表单中没有调用has_delete_permission
  • 它在所有其他应用程序中都可以正常工作,但仅在我当前的应用程序中无法正常工作。所以我接受你的回答。
【解决方案2】:

如果您的目标是永久删除所有管理员更改表单底部的“删除”按钮,您可以通过修改文件 .../django/contrib/admin/templatetags/admin_modify.py 来实现。

特别是替换以下行:

    'show_delete_link': (not is_popup and context['has_delete_permission']
                          and (change or context['show_delete'])),

与:

    'show_delete_link': False,

并且管理员更改表单不应该在左下角显示删除按钮。

【讨论】:

  • 编辑 django 源文件会影响所有其他应用程序。但我只想在我当前的应用程序中实现这一点。
  • 是的,如果你想升级你的 django 怎么办?
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多