Django使用内联表单集进行表单验证

时间:2011-06-18 01:47:04

标签: django validation django-forms inline-formset

我在一个HTML页面上有一个主表单和三个内联forsets,用于为客户创建Estimates。 “main”表单的主键用作所有三个内联表单集的外键。我可以创建新的估计值,保存它们,更改数据等等没问题。但是,它仅在所有必需数据都存在且“有效”时才有效。

如何在输入所有数据的情况下重新显示HTML页面,但错误地显示在错误的位置?

为了进一步解释我的情况,单个简单形式的常规方法是这样的(这是我的头脑,所以希望我没有代码错误):

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        myform.save()
        ...
        return HttpResponseredirect(...)
else:
    myform = new form from model etc...
return render_to_respose(template.html, {'myform':myform}, context_instance=RequestContext(request))

现在,如上所述,如果存在验证错误,表单将重新显示用户已提交的数据,并在相应字段旁边显示一些错误。

使用内联表单集,我们会执行以下操作(假设myForm具有PK并且myInline通过外键使用该PK):

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

因此,使用上面的代码,如果myForm中有验证错误,我们会退出if语句并重新显示表单以显示错误。但是,尚未创建内联表单(myInline = inlineFormset(request.POST, instance=tmp)行),因为检查myForm的有效性后发生,我们收到错误myInline Referenced before assignment管他呢。

为了解决这个问题,我尝试了移动线路:

        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)

在检查myForm是否有效之前,以便我可以捕获内联表单的POST数据。但我不能这样做,因为我没有检查myForm是否有效。

鸡肉和鸡蛋。啊!

那么,在重新显示用户输入的内联表单集内容时,如何进行验证并显示表单的输入错误?

很抱歉这篇文章很长,但我不知道如何缩短这个问题。


编辑:

好的,我想出了如何显示myForm主表单的验证错误,并重新显示所有myForm字段以及myInline formset字段。它是这样的:

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
    myInline = inlineFormset(request.POST)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

在退出主myInline语句之前,我只是潜入新的if作业。

希望这可以帮助其他人解决同样的问题。

干杯!

1 个答案:

答案 0 :(得分:1)

好的,我想出了如何显示myForm主表单的验证错误,并重新显示所有myForm字段以及myInline formset字段。它是这样的:

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
    myInline = inlineFormset(request.POST)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

在退出主myInline语句之前,我只是潜入新的if作业。

希望这可以帮助其他人解决同样的问题。

干杯!