我在一个 HTML 页面上有一个主表单和三个内联 forset,目的是为客户创建 Estimates。“主”表单的主键用作所有三个内联表单集的外键。我可以创建新的估计,保存它们,更改数据等。没问题。但是,它只有在所有必需的数据都存在并且“有效”的情况下才有效。
如何让 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
字段。它是这样的:
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
。
希望这可以帮助其他人解决同样的问题。
干杯!