我有一个表单向导,其中,在第一步中,创建模型A的实例,然后在第二步中,使用ForeignKey字段创建模型B,该字段应包含来自步骤1的模型A实例。为了验证工作,我需要保存第1步表单(可能是commit=False
,以防用户选择返回步骤?)在步骤1和2之间。最好的方法是什么?
答案 0 :(得分:3)
我认为您可以在重新实现“完成”向导方法时管理它,就在您将表单的数据保存到数据库的瞬间(取决于您的最终目标,但如果您是一个向导可能是你的话)正在寻求在向导结束时保存数据)。想想那些:
因此,您可以为B创建表单而不必担心“步骤2”中的“A”数据,因为当您处于向导的“最后一步”时数据将有效。我的想法是你只能用你想要从B中保存的数据来制作一个B形式但没有引用A.例如,如果我们有一个BModel,如下所示:
Class B(models.Model):
a = models.ForeignKey('A')
name = models.CharField(max_lenght=50)
您可以使用以下内容为B创建表单:
Class BForm(forms.Form):
name = forms.CharField(max_length=50)
最后在“完成”方法中,您有一个form_list
,其所有表单都有效,您可以这样做:
def done(self, form_list, **kwargs):
b_data = {}
for form in form_list:
# Getting the A instance
if isinstance(form, AForm):
a_instance = form.save()
# Getting B data
elif isinstance(form, BForm):
b_data = form.cleaned_data
else:
form.save()
b_data.update({'a': a_instance})
BModel.objects.create(**b_data)
return redirect("success_url")