Django:使用inlineformset对相关模型进行内联编辑
问题描述:
我仍然坚持在同一页面上使用相关模型的内联树样式。 我有三个型号,A,B和CDjango:使用inlineformset对相关模型进行内联编辑
Class A
Class B
fb = foreignkey(A)
Class C
fc = foreignkey(B)
在admin.py我做这样的事情
AdminA
inlines = [inlineB]
AdminB
inlines = [inlineC]
我想,当我编辑/添加模型A,I应该能够在线添加ModelB,并添加模型B的相关模型C条目。我正在尝试使用inlineformsets,但无法找到如何将它们用于我的目的。此外,我发现this old discussion on same problem。但是,再次,因为我是新来的Django,我不知道如何使它工作。
答
它有点奇怪的回答你自己的问题,但嘿没有人加强。并感谢Bernd指引我正确的方向。该解决方案需要制定中间模型。在我的情况下BC类。
class A(models.Model):
a = models.IntegerField()
class B(models.Model):
fb = models.ForeignKey(A)
b = models.IntegerField()
class C(models.Model):
fc = models.ForeignKey(B)
c = models.IntegerField()
class BC(models.Model):
fc = models.ForeignKey(A)
fb = models.ForeignKey(B)
而不是在模型A的管理中有InlineB,使用BC的内联。所以完整的admin.py看起来像。
class InlineC(admin.TabularInline):
model = C
extra = 1
class BCInline(admin.TabularInline):
model = BC
extra = 1
class AdminA(admin.ModelAdmin):
fieldsets = [
(None, {
'fields': ('a',)
}),
]
inlines = [BCInline]
class AdminB(admin.ModelAdmin):
fieldsets = [
(None, {
'fields': ('b',)
}),
]
inlines = [InlineC]
瞧,我得到popus按钮来创建B的完整对象,在模型A
_What的添加页面你真的到目前为止试试吗?_你做了一个相关的问题12小时前,其中你说模型B仅仅定义了A和C之间的关系。我曾经与django-tagging中的模型有类似的设置,它基本上使用'TaggedItem'的'GenericInlineAdminForm'工作,它也主要定义标签,标签对象和内容类型之间的关系。但是,如果您仅指出相当抽象的问题,则无法期望在此得到有用的答案。 – 2010-10-07 13:39:23
12小时前,是B是抽象类。但没有更长的时间,我对班上做了一些改变。早些时候,我希望找到一些内置的解决方案,比如如果你想创建一个foreginkey对象就会出现的弹出窗口。现在我正在尝试创建一个inlineformset类型的结构。所以在Inline行中,我希望除了B的字段外,我还能够添加C类对象的实例。所以寻找一个使用模型,inlineformsets等自定义的formset解决方案。事实上,我的问题是完全一样的,我提到的链接。你可以填写我的解决方案的细节吗? – Neo 2010-10-07 13:53:04
请查看http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#inlinemodeladmin-objects。如果您为模型B定义了InlineAdminForm,例如派生自admin.TabularInline,你应该得到一个表单显示,它提供了** + ** - 按钮,它们可以让你在弹出窗口中创建C的实例。如果这不起作用,请检查您的外键。您链接的问题基本上对您的问题有合理的答案。 – 2010-10-07 14:34:06