Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:重定向后处理表单数据_Python_Django_Forms_Post - Fatal编程技术网

Python Django:重定向后处理表单数据

Python Django:重定向后处理表单数据,python,django,forms,post,Python,Django,Forms,Post,我有一个Django应用程序,有两个视图(实际上更多,但我正在简化)。第一个视图显示一个页面,其中包含关于对象的详细信息,并且有一个可以提交的表单。第二个视图称为提交表单时购买POST请求,然后重定向回第一个视图: views.py: def main_view(request): context = {} # other view code here context['form'] = Form() return render(request, 'mypag

我有一个Django应用程序,有两个视图(实际上更多,但我正在简化)。第一个视图显示一个页面,其中包含关于对象的详细信息,并且有一个可以提交的表单。第二个视图称为提交表单时购买POST请求,然后重定向回第一个视图:

views.py:

def main_view(request):
    context = {}
    # other view code here

    context['form'] = Form()

    return render(request, 'mypage.html', context)


def form_view(request):
    form_data = Form(request.POST)

    if form_data.is_valid():
        # process form here

    else:
        # add an informative message
        messages.add_message(request, messages.INFO, "Error message here")

        return redirect('url_of_main_view')
我在这里遇到的问题是,我希望将表单数据传递回主视图,以防止再次填写整个表单,并允许显示验证错误

我通常只需在一个视图中处理表单即可完成此操作,例如:

def view(request):
    context = {}

    # other view code here

    context['form'] = Form()

    if request.method == 'POST':
        form_data = Form(request.POST)

        if form_data.is_valid():
            # process form data

        else:
            # handle messages
            context['form'] = form_data

    return render(request, 'mypage.html', context)
然而,这(至少在我的情况下)将导致一个大的视图,因为我有许多不同的表单可以从这个页面提交。我还喜欢在表单发布后重定向,以避免在用户刷新页面时重新提交数据

我的问题是:

  • 这(第一个例子)真的是构建表单处理代码的合理方法吗?第二个例子是更明智的做法,还是有更好的办法?也许我应该在主视图中执行表单验证,然后调用一个单独的方法来处理表单数据

  • 如果我使用第一个示例,使用一个单独的视图来处理表单post,那么处理表单未通过验证且应传递回主视图的实例的最佳方法是什么?我应该为此使用会话,还是有更有效/更干净的方法

  • 谢谢


    Alex

    您可以使用基于类的视图在单个类中处理get和post方法。如果表单不大,您可以简单地将验证错误作为查询参数传递回去(例如
    重定向('/mainview?name=invalid%20name')
    )。我想到的另一件事是从第二个视图简单地呈现主页的模板,而不是进行重定向,例如(
    render(request,'mypage.html',context_,with_form_errors)
    )@vivekpradhan我将更详细地了解基于类的视图;我看了一些关于这个主题的简单指南,但它们只处理一个表单和一个简单视图,我也看不出它们处理重定向的方式与标准视图有什么不同。我会好好看看的,谢谢@不幸的是,CrowbarKZ的一些表单相当大,对于我估计的GET参数来说太大了,或者至少太大了,无法保证使用这种方法。主视图和页面相当复杂,因此需要重定向到该视图,或者让所有内容都从该视图运行。不过,为这个建议干杯!