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

时间:2010-10-28 14:27:05

标签: django django-admin

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

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

7 个答案:

答案 0 :(得分:108)

简单:)

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

答案 1 :(得分:75)

如果要禁用非自定义的特定操作,请执行此操作。在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')会为所有模型禁用它,因此您必须在每个modelAdmin后明确包含它们

答案 2 :(得分:11)

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

答案 3 :(得分:9)

你可能正在使用:

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

答案 4 :(得分:1)

admin.site.disable_action('delete_selected')

来自docs

答案 5 :(得分: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_saveshow_save_and_continue进行同样的操作。更多信息和替代方法here

还请注意,Django 2.1 现在具有单独的has_view_permissiondocs),根据您的使用情况,可能是更好的选择情况。

答案 6 :(得分:0)

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

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

您可以在所有希望防止此类删除的管理员中使用此功能:

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...