簡體   English   中英

在繼承Django Admin中StackedInline的類中顯示不同字段

[英]Display different fields inside a class inheriting StackedInline in Django admin

我需要以下問題的幫助:

使用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

我很努力,卻沒有找到能幫助我解決問題的方法。 我發現了一些主題:

這里 在這里

有人可以舉例說明可以完成這項工作的代碼嗎?

InlineModelAdmin.get_formset()時將當前對象(我是說當前父對象)作為參數,並通過調用self.get_fieldsets()構建內聯表單的字段列表(實際上是對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)

現在您說您“努力嘗試”並且“沒有發現任何東西”-但是您是否至少“嘗試了”僅查看源代碼? 我花了幾分鍾才弄清楚調用鏈和參數。

我解決了一種不太干凈的方法,但是對我有用。 對於有類似問題並需要示例的任何人,請參見下面的代碼。

在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM