Django 将子类modelforms组合到父模型中

Django 将子类modelforms组合到父模型中,django,Django,我正在使用django的表单向导进行调查,我想将整个调查保存到一个模型中。我已经将模型拆分为多个表单,以便在每个FormWizard步骤中都有模型的子集。 问题是,如何在最后将它们重新组合在一起? My models.py的外观如下所示: class BigSurvey(models.Model): field1 = models.TextField() field2 = models.TextField() ... field40 = models.CharFi

我正在使用django的表单向导进行调查,我想将整个调查保存到一个模型中。我已经将模型拆分为多个表单,以便在每个FormWizard步骤中都有模型的子集。 问题是,如何在最后将它们重新组合在一起? My models.py的外观如下所示:

class BigSurvey(models.Model):
    field1 = models.TextField()
    field2 = models.TextField()
    ...
    field40 = models.CharField(max_length=10)
class FirstPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field1', 'field2')

class SecondPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field3', 'field4')
我的forms.py是这样的:

class BigSurvey(models.Model):
    field1 = models.TextField()
    field2 = models.TextField()
    ...
    field40 = models.CharField(max_length=10)
class FirstPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field1', 'field2')

class SecondPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field3', 'field4')
以此类推,共有四个表单和30个字段。每个子类模型表单的字段组合起来就是BigSurvey模型中的所有字段

这让我可以把这个大调查分为四个步骤。表单向导返回一个对象表单列表,它是四种表单(FirstPageForm、SecondPageForm等)的列表

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

更新: 通过迭代表单和字段并使用值字典填充新表单来解决。使用setattr进行填充(根据下面科琳的回答)会导致未绑定的形式。 我的工作解决方案:

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

您可以迭代每个表单中的所有字段,并将BigSurvey字段指定给它们的值

bg = BigSurvey()

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

bg.save()

解决了。谢谢还有一个问题是,如果我在BigSurvery中添加一个字段,我必须手动将其添加到一个子窗体中,这看起来不太干燥。。。但我可以接受。谢谢。是的,我不确定有没有办法解决这个问题。。。很高兴我能帮上忙:)事实上,你的答案有一个错误(更新我上面的问题以反映解决方案)。使用settattr填充表单时,表单仍然未绑定(不知道为什么),因此调用bg.is\u valid()返回false(调用bg.is\u bound()也返回false)。答案是使用迭代字段/值创建一个字典,并在创建字典时使用字典填充bg。