如何在一个django表单工具WizardView中使用多个modelForms保存多个模型



下面是我的场景:

我有两种型号:

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_qualifiedPerson模型中不可为null,验证将始终失败。您可以一次性保存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. 如果你的案例和你提供的表格一样简单,你应该把前两个表格作为一个表格

最新更新