Отображение выбранных полей связанной модели M2M в InlineAdmin - PullRequest
1 голос
/ 31 октября 2011

В приложении django у меня есть модель HouseHold с children внешним ключом ManytoMany для Child модели.
В админе я показываю связанные экземпляры Child вВстроенный, внимательно следя за django документами по теме :

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

Я просто хотел показать для каждой строки редактирования детейнекоторые из его полей (имя, фамилия, школа ...) вместо этого выберите виджет.Возможно ли это?

обновление: Решение для очень похожего вопроса здесь не применимо, ошибка говорит о том, что Child не имеет отношения к HouseHold (что несколько верно, но оно имеетобратный)

1 Ответ

1 голос
/ 31 октября 2011

Это базовая функция M2M здесь. Inlines работают от принципа, что встроенный объект напрямую связан с редактируемым родительским объектом. Отношение «многие ко многим» не подходит, поскольку ребенок не имеет прямого отношения к родителю, а скорее относится к промежуточной таблице, которая сама связана с родителем. Вот почему вы можете использовать Household.children.through, а не просто Child. На самом деле существует связь между Household.children.through и Household, но не между Child и Household.

Тем не менее, для ваших целей вы можете достичь желаемого, просто спроектировав модели в первую очередь. Семья и дети - это , а не отношения M2M. Домохозяйство имеет много детей, но ребенок имеет только одно домохозяйство. Это означает, что домохозяйство должно быть ForeignKey для ребенка, и тогда вы сможете легко вставить Child.

...