下面是我的场景:
我有两种型号:
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
模型中不可为null,验证将始终失败。您可以一次性保存PersonalForm
和IsQualifiedForm
,因为它们无论如何都引用相同的模型。为此,请在另一个窗体中设置一个窗体的值。例如:
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')
一些注意事项:
- 您可能应该使用命名步骤,而不是依赖于表单索引
- 如果你的案例和你提供的表格一样简单,你应该把前两个表格作为一个表格