Вложенные модели/встроенные наборы форм

Я работаю над страницей, которая должна иметь пару уровней редактируемых данных. По сути, объект может иметь от нуля до многих групп, и каждая группа может иметь от нуля до многих пользователей. Модели следующим образом:

from django.contrib.auth.models import User

class Platoon(models.Model):
    name = models.CharField(max_length=60)


class Squad(models.Model):
    name = models.CharField(max_length=60)
    platoon = models.ForeignKey('military.Platoon')


class Soldier(models.Model):
    display_name = models.CharField(max_length=60)
    user = models.ForeignKey(User)

class SquadMember(models.Model):
    squad = models.ForeignKey('military.Squad')
    soldier = models.ForeignKey('military.Soldier')

Таким образом, в этом случае у взвода может быть несколько отделений, которые, в свою очередь, могут иметь несколько членов отделения, где член отделения является перекрестной ссылкой на солдата.

При рендеринге страницы мы знаем, какой взвод мы рассматриваем, поэтому просто получить список отрядов и членов отряда несложно. Проблема в том, что нам нужно иметь возможность добавлять/редактировать/удалять отряд на странице, а также добавлять/удалять участников для каждого отряда. Я уже пару дней пытаюсь разобраться с обработкой этих данных, но без каких-либо реальных прорывов. Я все время возвращаюсь к мысли, что это должен быть какой-то вложенный набор форм модели или, возможно, встроенные наборы форм, но я не смог найти много материала по этому вопросу.

Любые предложения о том, как подойти к этому?

Спасибо,

Алекс


person user2708386    schedule 30.10.2013    source источник


Ответы (1)


Вы почти правы, ваша единственная проблема в том, что django не поддерживает вложенные встроенные наборы форм. К счастью, кто-то создал приложение django, которое позволяет это в админке: django-nested-inlines . Я использую их довольно успешно в своем собственном проекте.

Для вашего сценария здесь вы должны настроить их следующим образом:

admin.py

from django.contrib import admin
from nested_inlines.admin import NestedModelAdmin, NestedTabularInline, NestedStackedInline

from .models import Platoon, Squad, SquadMember


class SquadMemberInlineAdmin(NestedStackedInline):
    model = SquadMember

class SquadInlineAdmin(NestedStackedInline):
    model = Squad
    inlines = [SquadMemberInlineAdmin,]

class PlatoonAdmin(NestedModelAdmin):
    inlines = [SquadInlineAdmin,]

admin.site.register(Platoon, PlatoonAdmin)

Вероятно, вы могли бы углубиться в это, добавив Soldier в качестве встроенного в SquadMember.

person hellsgate    schedule 30.10.2013
comment
Спасибо, Хеллсгейт! Я бегло просмотрел django-nested-inlines несколько недель назад; У меня сложилось впечатление, что его можно использовать только во встроенном приложении администратора. Знаете ли вы, применимо ли это и к пользовательским формам? - person user2708386; 30.10.2013
comment
Извините, это совсем не то, что я пробовал. Это вполне возможно, расширив один из классов форм из вложенных строк, а не из стандартного ubt ModelForm, как я уже сказал, я не пробовал. - person hellsgate; 30.10.2013