【问题标题】:Combine subclassed modelforms into parent model将子类模型组合到父模型中
【发布时间】:2012-10-28 01:50:47
【问题描述】:

我正在使用 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')

依此类推,总共有 4 个表单和 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()

【问题讨论】:

    标签: django


    【解决方案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()
    

    【讨论】:

    • 解决了。谢谢!仍然存在的问题是,如果我在 BigSurvery 中添加一个字段,我必须手动将其添加到其中一个子表单中,这似乎不太干......但我可以忍受。谢谢。
    • 是的,我不确定有没有办法解决这个问题......很高兴我能提供帮助:)
    • 实际上,您的回答有误(更新我上面的问题以反映解决方案)。当您使用 settattr 填充表单时,表单仍然未绑定(不知道为什么),因此调用 bg.is_valid() 返回 false(调用 bg.is_bound() 也返回 false)。答案是用迭代的字段/值创建一个字典,并在创建时用字典填充 bg。
    猜你喜欢
    • 2011-04-30
    • 2012-04-11
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多