我正在建立一个网站,我想要各种视图,要求用户从我们的页面请求报价。我想尽可能将代码保留为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`
答案 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请求。
我可以想到两个问题的解决方案:
第二个选项是在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 ;)
输入以匹配相应的视图(就像我想要的那样)。