ben*_*jie 6 django django-admin
我的模型A,B和AB。
A对象有一个可以通过我的中间模型链接到许多对象的ManyToManyField调用。在我的模型的管理页面上,我
有一个非常漂亮的部分,里面有很多对象。A.mBABTabularInlineABA
一切都很好。除了该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
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?或者有没有其他方法可以为TabularInline字段完成此操作?
OP 设置小部件属性的想法应该可行。
基本思路如下:
允许您选择对象的TabularInlineforAB中的实际表单字段B是ModelChoiceField。这个字段有一个Select小部件,包装在一个RelatedFieldWidgetWrapper 中。后者控制选择框旁边的“添加”和“更改”(或“编辑”)按钮。要删除这些按钮,请将小部件的can_add_related和can_change_related属性设置为False。
这实际上是 OP 试图做的。但是,OP 试图扩展get_form,但据我所知(来源),该方法仅适用于ModelAdmin,而不适用于。TabularInline
get_form我们可以在 上扩展 eg formfield_for_dbfield( source )而不是使用,TabularInline如下所示(基于 OP 的示例):
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
Run Code Online (Sandbox Code Playgroud)
在这里,我们假设 OP 的AB模型如下所示:
class AB(models.Model):
a = models.ForeignKey(to='A', ...)
b = models.ForeignKey(to='B', ...)
...
Run Code Online (Sandbox Code Playgroud)