gpt4 book ai didi

django - 如何从 TabularInline 管理字段中删除添加和更改按钮?

转载 作者:行者123 更新时间:2023-12-03 14:11:38 27 4
gpt4 key购买 nike

我有模型 A , B , 和 AB .A对象有一个 ManyToManyFieldA.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

这是一个错误吗?或者是否有其他方法可以为 TabularInline 完成此操作领域?

最佳答案

OP 设置小部件属性的想法应该可行。

基本思路如下:
TabularInline 中的实际表单字段为 AB允许您选择 B对象是 ModelChoiceField .该字段有 Select小部件,包裹在 RelatedFieldWidgetWrapper 中.后者控制选择框旁边的“添加”和“更改”(或“编辑”)按钮。要删除这些按钮,请设置小部件的 can_add_relatedcan_change_related属性为 False .

这实际上是 OP 试图做的。但是,OP 试图扩展 get_form ,但该方法仅适用于 ModelAdmin ,不上TabularInline ,据我所知( source )。

而不是使用 get_form ,我们可以扩展例如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

这里我们假设 OP 的 AB模型看起来像这样:
class AB(models.Model):
a = models.ForeignKey(to='A', ...)
b = models.ForeignKey(to='B', ...)
...

关于django - 如何从 TabularInline 管理字段中删除添加和更改按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com