如何在一个 django 表单工具 WizardView 中保存具有多个模型表单的多个模型

How to save multiple models with multiple modelForms in one django form-tools WizardView

这是我的场景:

我有两个模型:

class Person(models.Model):
    # --- model fields ---

class Qualification(models.Model):
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)
    # --- other fields --- 

和模型形式:

class PersonalForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['first_name', 'last_name', 'email', 'id_number', 'date_of_birth']

class IsQualifiedForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['is_qualified']

class QualificationForm(forms.ModelForm):
    class Meta:
        model = Qualification
        fields = ['level', 'course_name', 'attainment']

最后是我的向导视图:

class Wizard(SessionWizardView):
    template_name = 'demo/wizard_test.html'
    form_list = [
        ("personal", PersonalForm),
        ("is_qualified", IsQualifiedForm),
        ("qualifications", QualificationForm),
    ]

    def get_form_instance(self, step):
        return self.instance_dict.get(step, None)

    def done(self, form_list, **kwargs):
        # What is the exact logic to be applied here to save the model forms concurrently?
        return redirect('home')

我正在尝试保存表格,但 运行 出现错误:

当我尝试调用时:

for form in form_list:
    form.save()

done()方法中,我得到一个错误,因为is_qualified在第一步被拦截为null。

此外,如何将 owner 字段的值设置为当前创建的人?

如有任何帮助,我们将不胜感激。

如果 is_qualified 在您的 Person 模型中不可为空,验证将始终失败。你可以做的是一次性保存 PersonalFormIsQualifiedForm,因为它们指的是同一个模型。为此,请在另一种形式中设置一种形式的值。例如:

def done(self, form_list, **kwargs):
    person = form_list[0].save(commit=False)
    person.is_qualified = form_list[1].cleaned_data['is_qualified']
    person.save()
    return redirect('home')

一些注意事项:

  1. 您可能应该使用命名步骤而不是依赖表单索引
  2. 如果您的案例与您提供的表格一样简单,您应该只将前两个表格合并为一个表格