【问题标题】:Building a list of ModelForms based on relation基于关系构建 ModelForms 列表
【发布时间】:2013-02-22 17:58:36
【问题描述】:

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

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 等。关键是它可以从管理员那里编辑,所以我或客户都不需要爬过数据,但它是有限的,所以用户只能选择每个统计数据中的一个(你可以' t 定义“颜色”两次)。

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

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

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

在我看来,无论是否存在任何给定 Statistic 的预先存在的实例,我如何生成这些事物的列表?

这似乎应该是一件简单得愚蠢的事情,但周五已经很晚了,一切看起来都很糟糕。

【问题讨论】:

  • 内联模型工厂无法满足您的需求?
  • @Brandon 我已经做 Django 几年了,从来没有听说过“内联模型工厂”这个词!如果您认为这就是问题(而且听起来确实很可疑),请根据我的示例将其写为答案并附上示例,您将获得很多积分!
  • 对不起,我说的是“表单集工厂”,不过,使用工厂模式来生成表单实例也不难。

标签: django django-models django-forms


【解决方案1】:

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

这将允许您根据需要创建尽可能多的 Statistic 对象实例。如果您需要动态创建 StatisticType 的实例,那就有点不同了。

当 Django 为外键、m2m 或选择字段实例化表单时,它只会接受它认为“有效”的选择,并且如果您使用相关模型中不存在的 JavaScript 添加选择或服务器端的一组选择。

所以,如果您需要即时创建 StatisticTypes,然后使用这个新值填充表单集实例,我建议使用 Knockout.js。它非常擅长在数据更改时保持大量 DOM 元素同步。

【讨论】:

  • 是的,我想知道我的模型现在是否有点狡猾 - 也许 Car to StatisticType 中应该有一个 m2m 将 Statistic 指定为“通过”类。我会在星期一戳一下。
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多