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

ben*_*jie 6 django django-admin

我的模型A,B和AB。 A对象有一个可以通过我的中间模型链接到许多对象的ManyToManyField调用。在我的模型的管理页面上,我 有一个非常漂亮的部分,里面有很多对象。A.mBAB
TabularInlineABA

一切都很好。除了该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字段完成此操作?

djv*_*jvg 6

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)