有人可以向我解释为什么表单2执行两次?换句话说,我会在控制台中看到2个打印语句,“来自表单2的Hello”。为什么我的Django表单执行了两次?
第一次打印声明发生在我从表单1中单击“提交”之后发生。第二次打印声明出现在我从表单2单击的第二个“提交”之后。如何使它仅打印一次?
views.py
def form1 (request):
NameFormSet = formset_factory (NameForm, formset = BaseNodeFormSet, extra = 2, max_num = 5)
if request.method == 'POST':
name_formset = NameFormSet (request.POST, prefix = 'nameform')
if name_formset.is_valid():
data = name_formset.cleaned_data
request.session ['data'] = data
return HttpResponseRedirect ('form2')
else:
name_formset = NameFormSet (prefix = 'nameform')
context = {'name_formset': name_formset}
return render (request, 'nameform/form1.html', context)
def form2 (request):
data = request.session ['data']
print ('Hello from form 2') # <==== This statement printed twice in the console
CheckBoxFormSet = formset_factory (CheckBox, extra = 2, max_num = 5)
if request.method == 'POST':
checkbox_formset = CheckBoxFormSet (request.POST, prefix = 'checkbox')
if checkbox_formset.is_valid():
for i, form in enumerate (checkbox_formset.cleaned_data):
data [i].update (form) # Join cleaned data with original data
del request.session ['data']
context = {'data': data}
return render (request, 'nameform/success.html', context)
checkbox_formset = CheckBoxFormSet (prefix = 'checkbox')
context = {'checkbox_formset': checkbox_formset, 'data': data}
return render (request, 'nameform/form2', context)
更新1: “打印”语句实际上是处理从表格1中得到的数据和在形式2显示它离开它,其中后端方法现在会导致该方法处理信息两次。我没有这样做的问题或错误,但它是没有必要的。
例如:
def form2 (request):
data = request.session ['data']
n, errors = getInfo (data) # <==== This statement performed twice in the console
if request.method = 'POST':
....
if checkbox_formset.is_valid():
for i, form in enumerate (checkbox_formset.cleaned_data):
data [i].update (form) # Join cleaned data with original data
n.process_new_data (data, errors)
del request.session ['data']
context = {'data': data, 'errors': error}
return render (request, 'nameform/success.html', context)
else:
checkbox_formset = CheckBoxFormset (prefix = 'checkbox')
context = {'data': data, 'errors': error}
return render (request, 'nameform/form2.html', context)
更新2: 由于我的解释是有点长,请允许我在这里讨论的问题啤酒。
是的,我完全理解它为什么处理两次。为了简要回答你的问题,把getInfo放在'POST'里会给我一个上下文,因为上下文中的“错误”字典不存在于第一个重定向中,所以出现未绑定的错误。
context = {'data': data, 'errors': errors}
我想更新我的帖子,以便我可以解释为什么我不能使用您的方法。 GetInfo从form1中获取数据,对其进行处理,并将其传递到窗体2以显示。我可以在form1中完成所有这些工作,但是我必须在form2中重做它,因为如果不通过会话传递,form2将不知道'n'或'errors'是什么。我只是想看看是否有更好的方法来做到这一点。
第一次印刷的重定向,当发生当你做POST时,实际上有一个GET来form2秒。如果你在if请求之后加入pirnt,那么你只会得到它一次。 – Ale
是的,这将适用于打印声明,并感谢您解决我的问题。真正的问题是“打印”语句是显示处理过的“数据”的实际后端程序。如果我将它移动到“if request”语句中,则表单2将被上下文语句无界限化。我已更新表格2来说明我的意思。 – dreamzboy
我认为你需要改写你的问题,@Ale解决了这个问题:_“有人可以向我解释为什么表单2执行了两次吗?换句话说,我会在控制台中看到2个打印语句,”表单2中的你好“ 。“_ – gonkan