为什么我的Django表单要执行两次?

2024-09-26 18:15:27 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下为什么表格2被执行了两次吗?换句话说,我会在控制台中看到2个打印语句,“Hello from form 2”。在

第一个打印语句发生在我从表单1中单击“提交”之后。第二个print语句出现在我从表单2中单击的第二个“Submit”之后。怎样才能使它只打印一次?在

视图.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: “print”语句实际上是一个后端方法,它处理从表单1获得的数据并将其显示在表单2中。离开现在的位置将导致该方法处理信息两次。我这样做没有问题或错误,但这是不必要的。在

例如:

^{pr2}$

更新2: 由于我的解释有点长,请允许我在这里提出一个问题。在

是的,我完全理解它为什么要处理两次。简单地回答你的问题,把getInfo放在'POST'中会给我一个上下文,未绑定的错误,因为上下文“errors”字典在第一个重定向中不存在。在

context = {'data': data, 'errors': errors}

我想更新我的帖子,这样我就可以解释为什么我不能用你的方法了。GetInfo从form1获取数据,对其进行处理,并将其传递到form2进行显示。我可以在form1中完成所有这些操作,但之后我必须在form2中重做,因为form2在不通过会话的情况下将不知道“n”或“errors”是什么。我只是想看看有没有更好的方法。在


Tags: nameform表单dataprefixifrequestcontext
2条回答

您可以通过在打印语句中包含stacktrace来进行调试:

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

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

当您将form2提交回同一个view方法时,它会再次打印您指定的行,这次if块中的代码将作为请求“POST”执行。在

关键是这一行重定向到form2视图:

return HttpResponseRedirect ('form2')

相关问题 更多 >

    热门问题