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

时间:2017-09-25 00:50:00

标签: django django-admin

我有模型ABABA个对象有一个名为ManyToManyField的{​​{1}},可以通过我的中间模型A.m链接到许多B个对象。 在我的AB模型的管理页面上,我有一个非常好的TabularInline部分,其中包含AB个对象。

一切都很好。除了A部分显示"添加"和"改变"每个TabularInline对象行中B对象的按钮,我想删除这些按钮。我仍然希望能够添加,更改和删除AB个对象行,而不是它们引用的AB个对象。

我尝试将Bcan_add_relatedcan_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 字段?

2 个答案:

答案 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中。后者控制选择框旁边的“添加”和“更改”(或“编辑”)按钮。要删除这些按钮,请将小部件的Bcan_add_related属性设置为can_change_related

这实际上是OP尝试执行的操作。但是,OP尝试扩展False,但据我所知(source),该方法仅适用于get_form,不适用于ModelAdmin

我们可以扩展例如,而不是使用TabularInline {{1}上的get_formsource),如下所示(基于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