将表格发送到另一个视图django

时间:2017-08-03 19:04:01

标签: django python-3.x django-forms

我正在建立一个网站,我想要各种视图,要求用户从我们的页面请求报价。我想尽可能将代码保留为DRY,因此我编写了一个视图quote,它将从各种视图接收引用请求,如果有验证错误,则重定向回到发出请求的页面。我设法使用超级糟糕的做法'全局变量来解决这个问题。我需要一个更好的解决方案,我想用当前表单重定向到相应的视图,这样我就可以遍历form.errors。这是我的代码:

def send_quote(request):
    form = Quote(request.POST)
    if form.is_valid():
        # do stuff when valid
        return redirect('Support:thanks', name=name or None)
    quote_for = request.POST['for_what']
    global session_form
    session_form = form
    return redirect('Main:' + quote_for) # Here I would like to send form instead of storing in global variable`

3 个答案:

答案 0 :(得分:1)

您可以使用HttpResponseRedirect函数,并将发出请求的页面作为参数传递。

return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

所有META数据都存储在字典中,如果您想了解更多信息,请查看文档。

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

答案 1 :(得分:0)

如果您重定向到引荐来源,form.errors将为空,因为重定向始终是GET请求。

我可以想到两个问题的解决方案:

  1. 使用JavaScript异步提交表单,以填充错误
  2. 制作包含表单支持POST的所有视图 - 执行此操作的一种方法是创建一个继承自FormView的基类
  3. 第二个选项是在Django中处理表单的典型方法 - 您在同一视图中处理POST和GET。

答案 2 :(得分:-1)

经过两天的搜索,我终于找到了答案。我只需保存".read": "auth != null && auth.uid == $uid" && auth.token.email.matches(/.*@mydomain.com$/)然后重定向,而不是在form中保存request.session。这是代码:

request.POST

现在我可以用我想要的所有视图重复这个,只需更改每个表单的def send_quote(request): form = Quote(request.POST) if form.is_valid(): # do stuff when valid return redirect('Support:thanks', name=name or None) quote_for = request.POST['for_what'] request.session['invalid_form'] = request.POST return redirect('Main:endview') def endview(request): session_form = request.session.pop('invalid_form', False) if session_form: form = Quote(session_form) # render template again with invalid form ;) 输入以匹配相应的视图(就像我想要的那样)。