【问题标题】:Displaying selected fields of a M2M linked model in an InlineAdmin在 InlineAdmin 中显示 M2M 链接模型的选定字段
【发布时间】:2011-12-18 16:18:31
【问题描述】:

在 django 应用程序中,我有一个 HouseHold 模型,children ManytoMany 外键指向 Child 模型。
在管理员中,我在内联中显示链接的 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 没有关系(这有点正确,但它有一个相反的关系)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 Chris,你是对的。我真的很希望有一个解决方案,因为我有另一个带有额外字段的 M2M 案例...
    • 但是,如果孩子的父母离异,孩子和父母一起生活,那么两个或多个家庭,那么 M2M?
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2011-10-28
    • 2022-01-04
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多