我估计其中包含有关潜在客户的详细信息。名称,地址等等。简单的东西。然后,我有一些inlineformset
用于与主要估算相关的产品,劳动力等。
我遇到的问题有点困难22.我的想法是我会以这种方式进行验证:
mainForm.is_valid()
inlineformset
s)my_inlineformset.is_valid()
my_inlineformset
验证,则将其保存 - 并通过mainForm
的ID将其“附加”到mainForm
。 这是一个问题:
如果主窗体未验证,则不会保存。如果它没有保存,我没有“附加”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个步骤。用户必须单独填写每个表单。这样我就可以安全地验证而不用担心我上面提到的问题。当然,这似乎让我让用户做更多的工作而不是必要的。
答案 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 %}
那应该是它。