【问题标题】:Django Redirect to previous viewDjango 重定向到上一个视图
【发布时间】:2012-03-10 04:40:57
【问题描述】:

我在页面 x 和页面 y 上有一个重定向到页面 z 的按钮。 在第 z 页,我有一个需要填写的表格。保存后,我想重定向到页面 x 或 y(无论我最初在哪个页面上)。

通常,您在视图中使用“重定向”,并指定要重定向到的页面。但是遇到这种情况你会怎么做呢?

有什么想法吗?

谢谢!

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    存储有关您的用户访问过的页面的信息,以便您以后检索它。可能最好的地方就是在会话中。

    【讨论】:

      【解决方案2】:

      您可以使用 GET 参数来跟踪您从哪个页面到达页面 z。因此,当您正常到达第 z 页时,我们会记住我们来自哪个页面。当您在第 z 页处理表单时,我们会使用之前保存的信息进行重定向。所以:

      页面 y 上的按钮/链接应包含一个参数,其值为当前 URL:

      <a href="/page_z/?from={{ request.path|urlencode }}" />go to form</a>
      

      然后在 page_z 的视图中,您可以将其传递给模板:

      def page_z_view(self, request):
          ...
          return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None) })
      

      在您的表单模板中:

      <form action="{% if from %}?next={{ from }}{% endif %}" />
      ...
      

      所以现在表单 - 在提交时 - 将传递一个 next 参数,该参数指示表单成功提交后返回的位置。我们需要修改视图来执行此操作:

      def page_z_view(self, request):
          ...
          if request.method == 'POST':
              # Do all the form stuff
              next = request.GET.get('next', None)
              if next:
                  return redirect(next)
          return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None)}
      

      【讨论】:

      • 所以我在页面 y 上的按钮应该是这样的: ?由于某种原因,这不起作用。一方面,即使“下一个”在我的表单有效下方,我的表单也不再保存。我被重定向到原来的欢迎页面。虽然那是错误的页面开始......我什至不知道它在哪里从大声笑那里得到的..
      • 我已经更新了答案 - 我在 &lt;form action ... 中添加了一个额外的 /。这里有两个阶段。一个当您最初到达空表单页面并且您到达的 URL 嵌入在 &lt;form action=... 中以在第二阶段提取时 - 当表单实际提交时。有点难以解释!请记住,您的view_z 被执行了两次——第一次到达时,第二次提交时
      • 谢谢 :) 只有一个快速更正:在您的
      【解决方案3】:

      Django 请求知道用户来自哪个页面:

      previous_page = request.META['HTTP_REFERER']
      

      它将包含以下内容:

      >>> print(previous_page)
      'http://www.myserver.com/myApp/z'
      

      因此您知道您来自哪里(警告,将其视为不安全数据并彻底验证,它甚至可能包含恶意数据)并使用这些信息。

      首先你将它传递给模板

      data = {
          ...,
          # also indicate, that saved data are valid and user can leave
          'previous_page': previous_page,
      }
      

      渲染页面 z.html

      return render(request, 'myApp/z.html', data)
      

      在页面 z 的模板中,您将元刷新标签添加到 .这将导致一旦保存表单并加载页面,用户将被重定向自动重定向回来:

      {% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %}
      

      这样做的好处是,该表格由页面 z.html 保存,在该页面中填写,您不需要通过页面 x 和 y 处理它(如果页面 x 和 y,这是唯一的方法在您的 Django 应用程序之外)。

      【讨论】:

        猜你喜欢
        • 2020-01-01
        • 1970-01-01
        • 2018-10-26
        • 2018-10-19
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多