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


71

我设法禁用了“删除所选”操作。简单。

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

Answers:


128

简单:)

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

9
该操作仍在下拉菜单中,但抛出禁止的403。要清理它,必须遵循我的解决方案。再加上这样做。
radtek

您是否也要删除该下拉列表,以防万一,请遵循radtek的解决方案
Capuchin

1
@radtek您是正确的,该操作仍将在下拉列表中,但是OP确实声明他已经设法禁用了删除所选操作。所以这就是所有必要的。
麦凯

很好,我2年前发布了完整的解决方案..不是问题。
radtek

86

如果要禁用非自定义的特定设备,请执行此操作。在Django 1.6.6中,我不得不扩展get_actions加定义has_delete_permission。该has_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'],仅适用于为该模型定义的自定义操作(def)。解决方案AdminSite.disable_action('delete_selected'),对所有模型都禁用该解决方案,因此您稍后必须在每个模型中明确包括它们


2
我不明白为什么将has_delete_permission返回为false不会摆脱该操作。我必须在Django 1.6.6中同时执行这两项操作
radtek 2014年

2
您可以使用actions = None代替get_actions()
dspacejs

那会禁用所有动作,而不仅仅是删除,不是吗?
radtek

哦,是的,我是坏人。我正在使用此答案来帮助禁用所有操作,但是您应该能够指定所需的特定操作
dspacejs

2
has_delete_permission似乎足以让我到处禁用删除功能。del actions['delete_selected']引发键错误。谢谢:)
拉米·阿洛什'19




2

这里的解决方案已经不错,但我更喜欢将其作为可重用的mixin,如下所示:

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

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

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...

0

这已经很老了,但是仍然可以帮助某个人。

假设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_save和进行相同的操作show_save_and_continue。更多信息和替代品在这里

另请注意,从2.1版开始,Django有一个单独的has_view_permissiondocs),根据您的用例,这可能是一个更好的选择

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.