基于关系构建ModelForms列表

时间:2013-02-22 17:58:36

标签: django django-models django-forms

我认为最好用一些简单的模型代码来解释(我从头开始写这个可能的语法问题 - 这里不重要):

class Car(models.Model)
    make = models.CharField(...)
    model = models.CharField(...)

class StatisticType(models.Model):
    name = models.CharField(...)

class Statistic(models.Model)
    car = models.ForeignKey('Car')
    stype = models.ForeignKey('StatisticType')
    data = models.CharField(...)

    class Meta:
        unique_together = (('car', 'stype'),)

我们有一辆带有一些硬编码统计数据的汽车,我们有一些数据库控制的统计数据。我可以添加ColoursWheel Size等等。关键是它可以从管理员编辑,因此我或客户都不需要浏览数据,但它是有限的,因此用户只能选择每个统计数据之一(你不能两次定义“颜色”)。

所以我现在正在尝试为此编写数据输入表单,我想要一个可以在页面上查看的可选ModelForms列表。我有最简单的ModelForm可能:

class StatisticForm(forms.ModelForm):
    class Meta:
        model = Statistic

棘手的部分(在我脑海中)是为每个StatisticType生成此ModelForm的实例,无论它是否存在。也就是说,如果Car对象没有分配Color,表单仍会显示。类似地,如果是,则在ModelForm中加载Statistic的实例。

在我看来,如何生成这些内容的列表,无论是否存在任何给定统计信息的预先存在的实例?

这似乎应该是一件非常简单的事情,但是周五晚了,所有事情都看起来像是skwonky。

1 个答案:

答案 0 :(得分:0)

听起来您可能想要利用inline model formset factory

这将允许您根据需要创建任意数量的Statistic对象实例。如果您需要动态创建StatisticType的实例,那就有点不同了。

当Django实例化表单时,对于外键,m2m或选择字段,它只接受它认为“有效”的选择,如果你使用相关模型中不存在的JavaScript添加选项,或者会抱怨服务器端的选择集。

因此,如果您需要动态制作StatisticTypes,然后使用此新值填充formset实例,我建议使用Knockout.js。当数据发生变化时,它非常善于保持大量DOM元素同步。

相关问题