【发布时间】:2017-03-07 10:41:12
【问题描述】:
我的风险模型表单设置为:
class RiskForm(forms.ModelForm):
class Meta:
model = Risk
fields = '__all__'
def __init__(self, *args, **kwargs):
progid = kwargs.pop('progid')
super(RiskForm, self).__init__(*args,**kwargs)
dict_of_fields = {}
all_char = Program.objects.get(id=progid).char_set.all()
for char in all_char:
c = []
for cat in char.cat_set.all():
c.append( (cat.label, cat.label) )
dict_of_fields[char.label] = c
self.fields[char.label] = forms.ChoiceField(c)
风险对象定义为:
class Risk(models.Model):
program = models.ForeignKey(Program, on_delete=models.CASCADE)
label = models.CharField(max_length=200, default='')
def __str__(self):
return self.label
但是,我想将我创建的额外字段存储到我的风险对象下的数据库中。 正如我现在所拥有的,它只存储两个属性“程序”和“标签”。但是,我还想将特征的答案存储到我的数据库中以供以后使用。
有关我如何设置的更多信息:Django Form Based on Variable Attributes
还有我的 ModelForm 的打印屏幕:https://gyazo.com/89c9833613dbcc7e8d27cc23a3abaf72
是否可以将所有 6 个答案存储在我的数据库中的风险对象下?如果是这样,我该怎么做?
【问题讨论】:
-
您可以创建 Answer 模型并与您的 Risk 模型建立多对多关系。
-
您能详细说明一下吗?我还在学习 Python,我的主管说我应该避免多对多的关系。如果没有其他方法,我认为除了使用它们之外别无他法。但是,我不知道如何构建它。你能帮我/给我一些关于如何写这个的通用(大纲)代码吗?
-
我建议你问问你的主管为什么要避免多对多的关系!!但是,我遵循的总体思路来决定这种关系将是 ForeighKey、OneToOneField 或 ManyToManyField:如果您可以说“一个风险可以有多个答案,一个答案可以有多个风险”然后使用 ManyToManyField。如果您可以说“一个风险可以有多个答案,一个答案可以在一个风险中”,然后使用外键。我想知道您的回答与风险或计划有何关联?
-
每个风险都有多个特征(因此有答案),每个答案可能有多个风险(例如:风险 1:{占用:农场,建筑:木框架} 风险 2:{占用:农场,结构:金属框架})。我可以看到有多少多对多字段派上用场。但是,我如何在没有 shell 命令的情况下初始化它(我可以在 shell 中做几乎所有事情,但是,在模型/表单中编程对我来说仍然相当困难)
-
我不确定你是否读过这篇文章:docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many 它通过示例展示了如何创建多对多对象并保存它们。
标签: django forms attributes add modelform