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/
会让您删除该对象。
所以你基本上有两个选择:
- 创建一个列出模型对象的自定义管理页面。每个对象
带有一个链接到
/admin/app/model/pk/delete/
的删除按钮。
以某种方式将其连接到您的管理员。
- 设置
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
我希望只能从管理员中删除值。 我为此编写了以下代码:
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/
会让您删除该对象。
所以你基本上有两个选择:
- 创建一个列出模型对象的自定义管理页面。每个对象
带有一个链接到
/admin/app/model/pk/delete/
的删除按钮。 以某种方式将其连接到您的管理员。 - 设置
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