3

我有一个表单向导,在第一步中,创建模型 A 的实例,然后在第二步中,使用 ForeignKey 字段创建模型 B,该字段应包含步骤 1 中的模型 A 实例。因此,用于验证为了工作,我需要在第 1commit=False步和第 2 步之间保存第 1 步的表单(也许用户选择后退一步?)。最好的方法是什么?

4

1 回答 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 回答