Django admin:防止添加,更改,但不能删除

Django admin: prevent add, change, but not delete

我希望只能从管理员中删除值。 我为此编写了以下代码:

def has_add_permission(self, request):
    return False

def has_change_permission(self, request, obj=None):
    return False

def has_delete_permission(self, request, obj=None):
    return True

但是,在这种情况下,我找不到 link 来删除对象。 如何解决?

更改 列表视图被禁用是有道理的。我注意到访问 /admin/app/model/1/delete/ 会让您删除该对象。

所以你基本上有两个选择:

  1. 创建一个列出模型对象的自定义管理页面。每个对象 带有一个链接到 /admin/app/model/pk/delete/ 的删除按钮。 以某种方式将其连接到您的管理员。
  2. 设置has_change_permission True 并确保详细信息页面显示自定义表单,所有 带有只读小部件的字段。

我会选择 2。因为它工作量少,可以为您提供更改列表页面(过滤器、操作)的所有好处,并保留默认的管理结构。一个很大的好处是用户可以看到他要删除的内容。

我会做这样的事情(未测试):

class ItemForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        for field in self.fields: 
            self.fields[field].widget.attrs['readonly'] = True

    class Meta:
        model = Item
        exclude = []

class ItemAdmin(admin.ModelAdmin):
    form = ItemForm

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return True

    def has_delete_permission(self, request, obj=None):
        return True