2012-11-07 49 views
2

我使用django的表单向导进行调查,并且我想将整个调查保存到单个模型中。我已经将模型分成多个表单,以便在每个FormWizard步骤中都有一个模型的子集。 现在的问题是,如何将它们结合在一起? 我的models.py如下:将子模型模型组合到父模型中

class BigSurvey(models.Model): 
    field1 = models.TextField() 
    field2 = models.TextField() 
    ... 
    field40 = models.CharField(max_length=10) 

和我forms.py是这样的:

class FirstPageForm(ModelForm): 
    class Meta: 
     model = BigSurvey 
     fields = ('field1', 'field2') 

class SecondPageForm(ModelForm): 
    class Meta: 
     model = BigSurvey 
     fields = ('field3', 'field4') 

等等,对四种形式和30场总。 BigSurvey模型中的所有字段都组合了每个子类模型表单的字段。

这使我可以将BigSurvey分成四个步骤。表单向导返回一个对象form_list,它是四种形式(FirstPageForm,SecondPageForm等)中的每一种的列表。

如何将这四种形式组合成一个BigSurvey对象来保存?

更新: 通过遍历表单和字段并使用值字典填充新表单解决。使用setattr填充(根据Colleen的答案)导致一个未绑定的表单。 我工作的解决方案:

newvalues={} 
for form in form_list: 
    for field in form.cleaned_data.keys(): 
     newvalues[field]=form.cleaned_data[field] 
newform = QuestForm(newvalues) 
newform.save() 

回答

1

你可以遍历所有在每个表单字段并分配BigSurvey字段的值。

bg = BigSurvey() 

for form in form_list 
    for field in form.cleaned_data.keys(): 
     setattr(bg, field, form.cleaned_data[field]) 

bg.save() 
+0

解决了它。谢谢!仍然存在的问题是,如果我在BigSurvery中添加一个字段,我必须将其添加到其中一个子表单中,这看起来不太干燥......但我可以忍受这一点。 谢谢。 – Basti

+0

是的,我不确定有什么方法可以解决这个问题......很高兴我可以帮助:) – Colleen

+1

其实,您的答案出错了(更新我的问题以反映解决方案)。 使用settattr填充表单时,表单仍处于未绑定状态(不知道为什么),因此调用bg.is_valid()返回false(调用bg.is_bound()也返回false)。 答案是创建一个包含迭代字段/值的字典,并在创建时使用字典填充bg。 – Basti

相关问题