0

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

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

  1. mainForm.is_valid()
  2. 如果主表单验证,则将其保存并移至“子”表单(inlineformsets)
  3. my_inlineformset.is_valid()
  4. 如果my_inlineformset验证通过,则也将其保存 - 并mainForm通过mainFormID 将其“附加”到 。

这里有一个问题:如果主表单没有验证,那么它就不会保存。如果它不保存,我没有什么可以“附加”inlineformset到的。因此,当mainForm不验证并且我被踢回表单以修复错误时,inlineformset将是空白的。因此,如果用户在表单上填写了一堆东西,inlineformset但是mainForm当他们被踢回表单以修复他们的错误时,他们的所有数据inlineformset都消失了。

我试图通过首先保存inlineformset并仅在主表单验证后将其附加到主表单来规避此问题。这样做的问题是,我可以白白保存一堆 s——inlineformset它们永远不会附加到估计值上。我不想要一整套没有附加到任何东西的记录,基本上,它们只会在数据库中不必要地漂浮。

这是我的视图代码:

    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()

所以你可以看到,如果 main 没有验证,那么我FormSet的 s 将永远不会被检查验证(然后它会抛出一个pform在启动之前调用的错误)。但是,如果我pform在 main 之前验证,那么我如何“附加”pformmainifmain本身不验证(因此不保存)?

那么,如果同一页面上的另一个表单没有验证,如何保持内联表单集数据呢?


编辑

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

4

2 回答 2

1

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

于 2013-04-14T19:38:03.523 回答
0

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

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

假设 M 用于主模型,A、B 用于 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 %}

应该就是这样。

于 2013-04-14T19:41:03.657 回答