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

kmbjn2e3  于 2022-11-26  发布在  Go
关注(0)|答案(7)|浏览(135)

我已经设法禁用了“删除选定项”操作。简单。
但是用户仍然可以点击一个项目,然后在底部有一个红色的删除链接。

hwazgwia

hwazgwia1#

简单:)

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

5ktev3wc2#

如果你想禁用一个非自定义的操作,可以这样做。在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']中,则只对您为该模型定义的自定义操作(def)有效。解决方案AdminSite.disable_action('delete_selected')对所有模型都禁用了它,因此您必须在以后根据每个模型显式地包含它们管理

vsmadaxz

vsmadaxz3#

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

a7qyws3x

a7qyws3x4#

您可能正在使用:

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

ni65a41a

ni65a41a5#

这里的解决方案已经很不错了,但是我更喜欢把它作为一个可重用的mixin,就像这样:

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

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

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...
jhiyze9q

jhiyze9q6#

admin.site.disable_action('delete_selected')
从文档中

0ve6wy6x

0ve6wy6x7#

这是非常古老的,但仍然,它可能会帮助一些人。
假设OP
...用户仍然可以单击某个项目,然后在底部显示红色的“删除”链接。
是“change”视图中的红色按钮,可以通过扩展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),这可能是一个更好的选择,取决于您的用例。

相关问题