在 Django Admin 中,我如何禁用删除链接

Posted

技术标签:

【中文标题】在 Django Admin 中,我如何禁用删除链接【英文标题】:In Django Admin how do I disable the Delete link 【发布时间】:2011-05-01 22:13:27 【问题描述】:

我已成功禁用“删除所选”操作。简单。

但是用户仍然可以点击一个项目,然后在底部有红色的删除链接。

【问题讨论】:

【参考方案1】:

简单:)

class DeleteNotAllowedModelAdmin(admin.ModelAdmin):
    # Other stuff here
    def has_delete_permission(self, request, obj=None):
        return False

【讨论】:

该操作仍在下拉列表中,但会抛出禁止的 403。要清理它,您必须遵循我的解决方案。另外也这样做。 您是否也想删除下拉菜单,如果出现这种情况,请按照 radtek 的解决方案 @radtek 你是对的,该操作仍将在下拉列表中,但 OP 确实声明他已经设法禁用删除选定的操作。所以这就是所有必要的。 没关系,我在 2 年前发布了完整的解决方案.. 不是问题。【参考方案2】:

如果您想禁用非自定义的特定功能,请执行此操作。在 django 1.6.6 中,我必须扩展 get_actions 并定义 has_delete_permissionhas_delete_permission 解决方案并没有摆脱下拉菜单中的操作:

class MyModelAdmin(admin.ModelAdmin):

    ....

    def get_actions(self, request):
        #Disable delete
        actions = super(MyModelAdmin, self).get_actions(request)
        del actions['delete_selected']
        return actions

    def has_delete_permission(self, request, obj=None):
        #Disable delete
        return False

不包括在 actions = ['your_custom_action'] 中,仅适用于您为该模型定义的自定义操作 (defs)。解决方案 AdminSite.disable_action('delete_selected') 为所有模型禁用它,因此您必须稍后在每个模型管理员中明确包含它们

【讨论】:

我不明白为什么将 has_delete_permission 返回为 false 并不能摆脱该操作。我必须在 django 1.6.6 中做这两件事 你可以用actions = None代替get_actions() 这将禁用所有操作,而不仅仅是删除,不是吗? 哦,是的,你是对的,我的坏笑。我正在使用这个答案来帮助禁用所有操作,但您应该能够指定您想要的特定操作 has_delete_permission 似乎足以让我在任何地方禁用删除。 del actions['delete_selected'] 引发关键错误。谢谢:)【参考方案3】:

只需禁用该用户或他所属的组的yourapp.delete_yourmodel 权限。

【讨论】:

这在 Django 1.3 及更早版本中不起作用,因为这个问题 code.djangoproject.com/ticket/8060 在 Django 1.4 中已修复。【参考方案4】:

你可能正在使用:

AdminSite.disable_action('delete_selected')

为了进一步控制,只需实现您自己的管理员并将其操作设置为您需要的任何内容:

class MyModelAdmin(admin.ModelAdmin):
    actions = ['whatever', 'actions']

参考:http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action

【讨论】:

不起作用。不影响单个页面。只是在浏览列表时禁用该操作。【参考方案5】:

admin.site.disable_action('delete_selected')

来自docs

【讨论】:

【参考方案6】:

这里的解决方案已经很好了,但我更喜欢将它作为可重用的 mixin,如下所示:

class NoDeleteAdminMixin:
    def has_delete_permission(self, request, obj=None):
        return False

您可以在所有要防止删除的管理员中使用它,如下所示:

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...

【讨论】:

【参考方案7】:

这是非常古老的,但它仍然可以帮助某人。

假设 OP 的

...用户仍然可以点击一个项目,然后底部有红色的删除链接。

指的是“更改”视图中的红色按钮。这个按钮可以通过扩展ModelAdmin.change_view方法来移除,如下:

def change_view(self, request, object_id=None, form_url='', extra_context=None):
    return super().change_view(request, object_id, form_url,
                               extra_context=dict(show_delete=False))

您可以对show_saveshow_save_and_continue 执行相同的操作。更多信息和替代方案here。

另请注意,从 2.1 版开始,Django 有一个单独的 has_view_permission (docs),这可能是更好的选择,具体取决于您的用例。

【讨论】:

以上是关于在 Django Admin 中,我如何禁用删除链接的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin-禁用编辑并删除特定模型的“保存”按钮

Django Admin Cookbook-20如何删除模型的“添加”/“删除”按钮

Django admin禁用编辑链接和添加删除操作

如何禁用编辑和删除rails_admin?

在 Django Admin >= 1.4 中禁用多重排序

在 django admin 中禁用/隐藏不必要的内联表单