主窗体未验证时验证inline_formsets

时间:2013-04-14 19:12:12

标签: django django-validation

我估计其中包含有关潜在客户的详细信息。名称,地址等等。简单的东西。然后,我有一些inlineformset用于与主要估算相关的产品,劳动力等。

我遇到的问题有点困难22.我的想法是我会以这种方式进行验证:

  1. 运行mainForm.is_valid()
  2. 如果主窗体验证,则保存并移至“子”窗体(inlineformset s)
  3. 运行my_inlineformset.is_valid()
  4. 如果my_inlineformset验证,则将其保存 - 并通过mainForm的ID将其“附加”到mainForm
  5. 这是一个问题: 如果主窗体未验证,则不会保存。如果它没有保存,我没有“附加”inlineformset的任何内容。因此,当mainForm未验证并且我被踢回到表单以修复错误时,inlineformset将为空。因此,如果用户在inlineformset上填写了大量内容,但却将mainForm搞砸了,那么当他们被踢回到表单中以修复他们的错误时,他们在{{1}上的所有数据} 离开了。

    我试图通过首先保存inlineformset并在主窗体验证后仅将其附加到主窗体来绕过此问题。这样做的问题在于,我可以毫无保留地保存一堆inlineformset - 它们永远不会附加到估算中。我不希望整个大量的记录没有附加到任何东西上,并且基本上只会在数据库中浮出水面。

    这是我的观看代码:

    inlineformset

    所以你可以看到,如果main没有验证,那么我的 if main.is_valid(): tmp = main.save(commit=False) if estID != 'new': tmp.routeNum = est.routeNum tmp.estMap = est.estMap tmp.estSketch = est.estSketch if estID == 'new': tmp.proposalID = newEstID('R') tmp.sysType = 'R' if estID == 'new': pform = pFormSet(request.POST, instance=tmp, prefix="product_form") lform = lFormSet(request.POST, instance=tmp, prefix="labour_form") oform = oFormSet(request.POST, instance=tmp, prefix="other_form") else: pform = pFormSet(request.POST, instance=est, prefix="product_form") lform = lFormSet(request.POST, instance=est, prefix="labour_form") oform = oFormSet(request.POST, instance=est, prefix="other_form") if pform.is_valid(): pform.save() 将永远不会被检查进行验证(然后它会抛出FormSet在启动之前调用的错误。但是,如果我在main之前验证pform,那么如果pform本身无法验证(因此无法保存),如何将pform附加到main

    那么如何挂起内联formset数据以及同一页面上的另一个表单是否无法验证?


    修改

    我想知道将这个页面(有4种形式 - 主要形式和3种内联形式)拆分为4个步骤。用户必须单独填写每个表单。这样我就可以安全地验证而不用担心我上面提到的问题。当然,这似乎让我让用户做更多的工作而不是必要的。

2 个答案:

答案 0 :(得分:1)

我不明白为什么在实例化formset之前需要验证并保存主窗体。通常要做的是首先实例化所有表单,然后在保存任何内容之前验证它们。这样,您可以保证只有在表格全部验证时才会保存表单,如果其中任何一个表单失败,您只需使用相关错误重新显示所有表单。

答案 1 :(得分:0)

我认为您的方法没问题,在一个页面上显示所有这些表单,但是您可能不需要表单集? ..我不完全确定,但如果您只需要页面中每个表单的1个实例,那么您可能根本不需要表单集。

关于验证,只需处理3种不同的表单,然后在保存过程中,手动执行所有的保存管理,并在保存主表单(commit = False)之前分配多个关系。

假设M代表主模型,而A代表M有外键的相关模型,那么你可以这样做:

# views.py ...

def my_display_forms_view(request):
    if request.method == 'POST':
        m = M()
        a = A()
        b = B()

        a_form = AForm(request.POST, instance=a)
        b_form = BForm(request.POST, instance=b)
        m_form = MForm(request.POST, instance=m)

        if a_form.is_valid() and b_form.is_valid() and m_form.is_valid():
            a = a_form.save()
            b = b_form.save()
            m = m_form.save(commit=False); # don't save it to db still
            m.a = na
            m.b = nb
            m.save()
            # eventually do some more stuff
    else:
       # generate new unbound forms here
       a_form = AForm()
       b_form = BForm()
       m_form = MForm()
    return render_to_response('template.html', {'m_form': m_form, 'a_form': a_form, 'b_form': b_form}, context_instance=RequestContext(request))

然后在你的模板上:

{% if m_form and a_form and b_form %}
<form ... >
<!-- show main form here -->
<fieldset>
<!-- here the other forms -->
</fieldset>
</form>
{% endif %}

那应该是它。