我需要以下问题的帮助:
使用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)
我努力了,没有找到帮我解决问题的东西。我发现的一些主题:
有人可以展示一个可以完成工作的代码示例吗?
答案 0 :(得分:0)
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)