在Django admin中继承StackedInline的类中显示不同的字段

时间:2015-05-13 13:42:08

标签: python django django-admin fieldset inlines

我需要以下问题的帮助:

使用Django管理员,我想在内联中隐藏一些字段,具体取决于对象是否存在。

与admin.ModelAdmin等效的示例:

super.setName()

如何使其等效于内联?

class ClassAdmin(admin.ModelAdmin):
    ...

    def get_form(self, request, obj=None, **kwargs):
        # if inline has not been saved
        if obj is None:
            self.fieldsets[0][1]['fields'] = tuple(x for x in self.fieldsets[0][2]['fields'] if (x!='field1'))

        else:
            self.inlines = self.inlines + [ClassInline,]

            if obj.field1 == 'N':
                self.fieldsets[2][7]['fields'] = tuple(x for x in self.fieldsets[2][8]['fields'] if (x!='field10'))

        return super(ClassAdmin, self).get_form(request, obj, **kwargs)

我努力了,没有找到帮我解决问题的东西。我发现的一些主题:

HereHereHere

有人可以展示一个可以完成工作的代码示例吗?

2 个答案:

答案 0 :(得分:0)

用当前对象(我的意思是当前的父对象)作为param调用

InlineModelAdmin.get_formset(),并通过调用来构建内联表单的字段列表(实际上用于调用inlineformset_factory()self.get_fieldsets(),传递当前(父)对象。所以重写InlineModelAdmin.get_formset()应该做:

class MyInlineAdmin(admin.StackedInline):
    def get_fieldsets(self, request, obj):
        fields = super(MyInlineAdmin, self).get_fieldsets(request, obj):
        if obj and obj.pk:
            return do_something_with(fields)
        else :
            return do_something_else_with(fields)

现在你说你“努力”而且“找不到东西” - 但是你至少“试过”只看一下源代码吗?我花了几分钟才弄清楚调用链和args ......

答案 1 :(得分:0)

我解决了一个不太干净的问题,但它对我有用。 对于有类似问题且需要示例的任何人...请参阅下面的代码。

在admin.py中

class MyInline(admin.StackedInline):
    form = MyForm
    model = MyModel
    fields = ('field1', 'field2', 'field3', 'field4', 'fied5', 'field6')
    list_display = ('field2', 'field3', 'field4', 'fied5', 'field6',)

    fieldsets = (
                (None, {
                    "fields" : ("field1",)
                }),
                ("Details", {
                    "fields" : ("field2", "field3", 'field4', 'posicao', 'venda')
                })
)


class MyAddInline(MyInline):
    """Inline displayed if there are no objects"""
    fieldsets = ((None, {
                        "fields" : ("field1",)
                }),)


class ClassXAdmin(admin.ModelAdmin):
    model = MyOtherModel
    ...

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            ...

        else:
            status = MyModel.objects.filter(fk=obj.pk).exists()
            if status:
                self.inlines = self.inlines + [MyInline,]
            else:
                self.inlines = self.inlines + [MyAddInline,]

        return super(ClassXAdmin, self).get_form(request, obj, **kwargs)