在InlineAdmin中显示M2M链接模型的选定字段

时间:2011-10-31 11:29:22

标签: django django-admin django-forms many-to-many

在django应用中,我有一个HouseHold模型,children模型的Child ManytoMany外键。
在管理员中,我在内联中显示关联的Child个实例,紧随django docs on the subject之后:

class FamilyInline(admin.TabularInline):
    model = HouseHold.children.through

class HouseHoldAdmin(admin.ModelAdmin):
     inlines = [ FamilyInline, ]
     exclude = ('children',)

我运作良好,但显示了一个HTML选择小部件,其中包含来自每个家庭的所有孩子(非常长:8000多个项目)

我尝试将此表单添加到FamilyInline:

class ChildForm(forms.ModelForm):
    class Meta:
        model = Child
        fields = ('name','school')

class FamilyInline(admin.TabularInline):
    form = ChildForm
    model = HouseHold.children.through

但这会引发错误:

FieldError at /admin/myapp/household/820126/
Unknown field(s) (name, school) specified for HouseHold_children

我只想为每个孩子编辑一些字段(名字,姓氏,学校......)而不是这个选择小部件。有可能吗?

更新:A solution for a very similar question here不适用,错误说Child与HouseHold没有关系(这有点真实,但它有反向的)

1 个答案:

答案 0 :(得分:1)

这是基本 M2M功能。内联工作取决于内联对象与正在编辑的父对象直接相关的原理。多对多关系不符合条件,因为子级与父级没有直接关系,而是与本身与父级相关的中间表相关。这就是为什么你可以使用Household.children.through而不只是Child。实际上Household.children.throughHousehold之间存在关联,但ChildHousehold之间不存在关联。

但是,出于您的目的,您可以通过简单地设计模型来实现您想要的目标。家庭和儿童是M2M关系。一个家庭有很多孩子,但一个孩子只有一个家庭。这意味着家庭应该是孩子的外国关键词,然后你就可以轻松地内联Child