2015-05-07 72 views
1

有人可以向我解释为什么表单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'是什么。我只是想看看是否有更好的方法来做到这一点。

+1

第一次印刷的重定向,当发生当你做POST时,实际上有一个GET来form2秒。如果你在if请求之后加入pirnt,那么你只会得到它一次。 – Ale

+0

是的,这将适用于打印声明,并感谢您解决我的问题。真正的问题是“打印”语句是显示处理过的“数据”的实际后端程序。如果我将它移动到“if request”语句中,则表单2将被上下文语句无界限化。我已更新表格2来说明我的意思。 – dreamzboy

+0

我认为你需要改写你的问题,@Ale解决了这个问题:_“有人可以向我解释为什么表单2执行了两次吗?换句话说,我会在控制台中看到2个打印语句,”表单2中的你好“ 。“_ – gonkan

回答

1

form2视图运行两次,一次是作为form1的重定向,它创建表单并呈现模板,缺少if request.method == 'POST'部分,因为这次请求是'GET'。

当您将form2提交回相同的视图方法时,它将再次显示您指示的行,此时if块中的代码将执行,因为请求是“POST”。

的关键是这一行重定向到Form2观点:

return HttpResponseRedirect ('form2') 
0

您可以通过堆栈跟踪到打印语句调试此:

import traceback 
print ''.join(traceback.format_stack()) 
+0

很高兴知道。谢谢。 – dreamzboy

相关问题