0

我需要帮助解决以下问题:

使用 Django 管理员,我想根据对象是否存在来隐藏一些内联字段。

等效于 admin.ModelAdmin 的示例:

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)

我怎样才能使它等同于内联?

class ClassInline(admin.StackedInline):
    # if obj:
        # display filed1, field2
    # else:
        # display filed3, field4

我努力尝试并没有找到可以帮助我解决问题的方法。我发现的一些主题:

这里这里这里

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

4

2 回答 2

0

InlineModelAdmin.get_formset()inlineformset_factory()以当前对象(我的意思是当前父对象)作为参数调用,并通过调用 on构建内联表单的字段列表(实际上是调用) 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)

现在您说您“努力”并且“没有找到任何东西”-但是您至少“尝试”看看源代码吗?我花了几分钟才弄清楚调用链和参数......

于 2015-05-13T14:34:23.510 回答
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)
于 2015-05-15T11:52:58.413 回答