[英]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.