我有一个表单向导,在第一步中,创建模型 A 的实例,然后在第二步中,使用 ForeignKey 字段创建模型 B,该字段应包含步骤 1 中的模型 A 实例。因此,用于验证为了工作,我需要在第 1commit=False
步和第 2 步之间保存第 1 步的表单(也许用户选择后退一步?)。最好的方法是什么?
问问题
713 次
1 回答
3
我认为您可以在重新实现“完成”向导方法时对其进行管理,就在您将表单数据保存到数据库的那一刻(取决于您的最终目标,但如果您使用向导,您可能正在寻找数据将在向导结束时保存)。想想那些:
- 如果用户通过了“第一步”,那么他在这一步中输入的数据是正确的。
- 如果用户通过了“第 2 步”,那么他在这一步中输入的数据也是正确的,以此类推。阅读 django文档的详细信息。
因此,您可以为 B 制作表格,而不必担心“步骤 2”中的“A”数据,因为当您处于向导的“最后一步”时,A 数据将是有效的。我的想法是,您可以只使用您想从 B 保存的数据而不是对 A 的引用来制作 B 表单。例如,如果我们有一个如下所示的 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")
于 2013-01-07T01:12:03.820 回答