Django表单向导 - 步骤2具有ForeignKey字段,其实例在步骤1 - 如何验证?

时间:2013-01-06 21:21:51

标签: django django-formwizard

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

1 个答案:

答案 0 :(得分:3)

我认为您可以在重新实现“完成”向导方法时管理它,就在您将表单的数据保存到数据库的瞬间(取决于您的最终目标,但如果您是一个向导可能是你的话)正在寻求在向导结束时保存数据)。想想那些:

  • 如果用户已通过“步骤1”,那么他在此步骤中输入的数据是正确的。
  • 如果用户已通过“步骤2”,则他在此步骤中输入的数据也是正确的,依此类推。阅读django doc
  • 的详细信息

因此,您可以为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")