Django:如何重定向到表单来源的页面

时间:2010-11-17 10:21:02

标签: python django

在我的Django应用程序中,我有多个页面显示一个链接,用于加载显示表单的新页面。提交表单时,重定向到访问此表单的原始页面的最简洁方法是什么?

原始页面 - >表格页面 - >原始页面

使用下一个变量似乎是unellegant因为我必须在原始页面链接上将其设置为GET变量,然后在表单中将其设置为隐藏的POST变量?任何其他想法将不胜感激。

3 个答案:

答案 0 :(得分:6)

有几种选择,都有利于和利益。

  1. 使用POST / GET
  2. 传递原始页面
  3. 将原始页面存储在会话中(显然无法使用多个选项卡)
  4. 将原始页面存储在cookie中(也不适用于多个标签)
  5. 如果是单页,则重定向到引荐来源。在您的情况下似乎不可能
  6. 我个人认为使用下一个参数是你最好的选择,但要记得保护它(只有相对网址,没有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传递给视图。