我认为最好用一些简单的模型代码来解释(我从头开始写这个可能的语法问题 - 这里不重要):
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'),)
我们有一辆带有一些硬编码统计数据的汽车,我们有一些数据库控制的统计数据。我可以添加Colours
,Wheel Size
等等。关键是它可以从管理员编辑,因此我或客户都不需要浏览数据,但它是有限的,因此用户只能选择每个统计数据之一(你不能两次定义“颜色”)。
所以我现在正在尝试为此编写数据输入表单,我想要一个可以在页面上查看的可选ModelForms列表。我有最简单的ModelForm可能:
class StatisticForm(forms.ModelForm):
class Meta:
model = Statistic
棘手的部分(在我脑海中)是为每个StatisticType生成此ModelForm的实例,无论它是否存在。也就是说,如果Car对象没有分配Color,表单仍会显示。类似地,如果是,则在ModelForm中加载Statistic的实例。
这似乎应该是一件非常简单的事情,但是周五晚了,所有事情都看起来像是skwonky。
答案 0 :(得分:0)
听起来您可能想要利用inline model formset factory。
这将允许您根据需要创建任意数量的Statistic对象实例。如果您需要动态创建StatisticType的实例,那就有点不同了。
当Django实例化表单时,对于外键,m2m或选择字段,它只接受它认为“有效”的选择,如果你使用相关模型中不存在的JavaScript添加选项,或者会抱怨服务器端的选择集。
因此,如果您需要动态制作StatisticTypes,然后使用此新值填充formset实例,我建议使用Knockout.js。当数据发生变化时,它非常善于保持大量DOM元素同步。