在我的Django应用程序中,我有多个页面显示一个链接,用于加载显示表单的新页面。提交表单时,重定向到访问此表单的原始页面的最简洁方法是什么?
原始页面 - >表格页面 - >原始页面
使用下一个变量似乎是unellegant因为我必须在原始页面链接上将其设置为GET变量,然后在表单中将其设置为隐藏的POST变量?任何其他想法将不胜感激。
答案 0 :(得分:6)
有几种选择,都有利于和利益。
POST
/ GET
我个人认为使用下一个参数是你最好的选择,但要记得保护它(只有相对网址,没有javascript的东西,csrf框架)所以你不会有任何安全问题。
答案 1 :(得分:6)
WoLpH 已经列出了合理的可能性,并指出(可能)最好的解决方案。所以我只会详细说明。
如果您需要处理此问题:原始页面 - >表格页面 - >原始页面然后实际上它将如下所示:原始页面 - [GET] - >表单页面 - [POST / submision] - >表单页面(2) - [GET /重定向] - >原始页面。这意味着,表单页面(2)阶段必须以某种方式知道重定向用户的位置,这里唯一合理的选择是使用会话(具有 WoLpH )或在POST中传递它,可能作为隐藏字段。
关于第一个GET并将next URL
传递到表单页面,您可以将其传递给查询字符串(您发现它不太优雅),或者您可以从HTTP_REFERER标头中提取它 - 这对像我这样的偏执狂用户不起作用。
您也可以在此处执行混合内容,例如,仅当用户未在其浏览器中关闭HTTP_REFERER时,才将next=<next-URL>
添加到查询字符串中。然后大多数用户都不会在网址中看到任何丑陋的东西。
请注意,所有这些都可以自动完成,即您可以将链接编写为:
<a href="{% url myform %}?{% inject_next_url %}">
当inject_next_url
仅在HTTP_REFERER不存在的情况下注入next={{ context['request'].get_full_path() }}
时。
然后,在表单处理程序中,您可以使用一些通用extract_next_url(request)
函数,该函数在以下其中一个中查找next URL
:查询字符串,HTTP_REFERER,request.POST或更多构思 - 其中一个:HTTP_REFERER ,request.REQUEST
答案 2 :(得分:0)
另一种选择可能是创建单独的URL conf以解析到同一视图,并将源视图作为kwargs传递给视图。