1

这是我的场景:

我有两个模型:

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字段的值设置为当前创建的人?

任何帮助,将不胜感激。

4

1 回答 1

0

如果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. 如果您的案例与您提供的表格一样简单,您应该将前两个表格制作成一个表格
于 2020-07-28T19:31:53.627 回答