我有模型A
,B
和AB
。
A
个对象有一个名为ManyToManyField
的{{1}},可以通过我的中间模型A.m
链接到许多B
个对象。
在我的AB
模型的管理页面上,我有一个非常好的TabularInline
部分,其中包含AB
个对象。
一切都很好。除了A
部分显示"添加"和"改变"每个TabularInline
对象行中B
对象的按钮,我想删除这些按钮。我仍然希望能够添加,更改和删除AB
个对象行,而不是它们引用的AB
个对象。
我尝试将B
,can_add_related
,can_change_related
属性设置为can_delete_related
,但这没有做任何事。
False
这是一个错误吗?或者是否有不同的方法来实现class ABInline(admin.TabularInline):
model = AB
def get_form(self, request, obj=None, **kwargs):
form = super(ABInline, self).get_form(request, obj, **kwargs)
form.base_fields['m'].widget.can_add_related = False
form.base_fields['m'].widget.can_change_related = False
form.base_fields['m'].widget.can_delete_related = False
return form
字段?
答案 0 :(得分:2)
您可以尝试使用此功能:
请参阅docs
class ABInline(admin.TabularInline):
model = AB
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 False
答案 1 :(得分:0)
OP设置小部件属性的想法应该起作用。
基本思想如下:
TabularInline
的{{1}}中允许您选择AB
对象的实际表单字段是ModelChoiceField。此字段具有一个Select小部件,包装在RelatedFieldWidgetWrapper中。后者控制选择框旁边的“添加”和“更改”(或“编辑”)按钮。要删除这些按钮,请将小部件的B
和can_add_related
属性设置为can_change_related
。
这实际上是OP尝试执行的操作。但是,OP尝试扩展False
,但据我所知(source),该方法仅适用于get_form
,不适用于ModelAdmin
。
我们可以扩展例如,而不是使用TabularInline
{{1}上的get_form
(source),如下所示(基于OP的示例):
formfield_for_dbfield
这里我们假设OP的TabularInline
模型看起来像这样:
class ABInline(admin.TabularInline):
model = AB
def formfield_for_dbfield(self, db_field, request, **kwargs):
formfield = super(ABInline, self).formfield_for_dbfield(
db_field, request, **kwargs)
if db_field.name == 'b':
# Assuming AB.b is the ForeignKey to B
formfield.widget.can_add_related = False
formfield.widget.can_change_related = False
# formfield.widget.can_delete_related = False # default is already False
return formfield