【问题标题】:Nested model/inline formsets嵌套模型/内联表单集
【发布时间】:2013-11-10 07:44:55
【问题描述】:

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

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

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

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

关于如何处理这个问题有什么建议吗?

谢谢,

亚历克斯

【问题讨论】:

    标签: django forms formsets


    【解决方案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 来进一步深入研究。

    【讨论】:

    • 谢谢,地狱之门!几周前,我简要地查看了 django-nested-inlines;我的印象是它只能在内置的管理应用程序中使用。你知道这是否也适用于自定义表单?
    • 对不起,我根本没有尝试过。很可能通过从嵌套内联而不是标准的 ModelForm ubt 扩展其中一个表单类,就像我说的那样,我没有尝试过
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多