嵌套模型/内联表单集

时间:2013-10-30 15:37:39

标签: django forms formsets

我正在处理一个需要有几个级别的可编辑数据的页面。实质上,一个实体可以有零到多个组,每个组可以有零到多个用户。模型如下:

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')

所以在这种情况下,一个排可以有多个小队,而小队又可以有多个小队成员,小队成员是士兵的交叉引用。

在渲染页面时,我们知道我们正在查看哪个排,所以只需检索一个小队和小队成员列表就很容易了。问题是我们需要能够在页面上添加/编辑/删除小队以及为每个小队添加/删除成员。我一直试图将这些数据处理好几天,但没有真正的突破。我一直认为它需要是某种嵌套的模型formset或者内联的formset,但是我还没有找到关于这个主题的更多材料。

有关如何处理此问题的任何建议吗?

谢谢,

亚历

1 个答案:

答案 0 :(得分:0)

你非常正确,你唯一的问题是django不支持嵌套的内联表单集。幸运的是,有人创建了一个django应用程序,允许在admin: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)

你可以通过将士兵作为内联添加到SquadMember来进一步深入研究。