【问题标题】:Render to response to a redirected url in Django渲染以响应 Django 中的重定向 url
【发布时间】:2023-12-14 21:00:02
【问题描述】:

在表单提交场景中,表单发布到“/submit”。我想在成功时将用户重定向到“/success”,并将一些消息传递给新 url 的模板。如何在 Django 中做到这一点? render_to_response 不做重定向,HttpResponseRedirect 不做模板渲染。

【问题讨论】:

  • 我假设 HttpResponseRedirect 只是告诉客户端重定向?它重定向的页面不会负责渲染吗?另外,如果有人手动进入您的 /success 页面怎么办?

标签: django redirect httpresponse


【解决方案1】:

Daniel Roseman 的响应可能危险,使您的网站容易受到 XSS 漏洞的攻击。

如果您必须这样做,请确保从传递的任何消息中去除 html 标记。

更好的方法是重定向到 /success/?msg=ok,并在您的视图中查看字典:

{ 'ok': 'Your success message' }

【讨论】:

    【解决方案2】:

    如果您的成功页面需要动态消息,您需要以某种方式将其传递到那里。您可以通过重定向到的 URL 中的 GET 参数来执行此操作 - 例如 return HttpResponseRedirect('/success/?msg=My+success+message+here') - 或通过在会话中设置一些值,成功视图可以获取这些值。

    【讨论】:

      【解决方案3】:

      做你想做的最好的方法是: 在您的视图中,将成功消息(或错误消息)设置为 dict。并使用 render_to_response 显示任何模板。

      在您的模板中,您可以验证是否有消息以及该消息是错误消息还是成功消息。

      有些是这样的: 在您看来:

      if anyError:
         dict = {"message" : {"error" : "The error message"}}
      else:
         dict = {"message" : {"success" :"The success message"}}
      

      在您的模板中:

         {% if message %}
            {% if message.error %}
               {{ message.error }}
            {% else %}
               {{ message.success }}
            {% endif %}
         {% endif %}
      

      希望对我有所帮助

      【讨论】:

        【解决方案4】:

        没有什么好方法可以做你想做的事。浏览器提交表单,这会将用户带到 /submit。一旦你决定它是否“成功”,就为时已晚;浏览器已经决定了它的目的地。你所能做的就是重定向。但是,正如您所发现的,当您重定向时,很难保持您的 POST 状态。

        我会放弃这个。这不是网站应有的运作方式。

        【讨论】:

          【解决方案5】:

          如果你扩展generic view,我认为 Django 已经这样做了。创建时有一个可选参数“post_save_redirect”。此功能用于自动生成的 Django 管理系统。例如,如果您想要一个新资源,比如用户,您可以访问 url“/user/add”。提交后,它会将您重定向到“/user/1”,并显示成功消息“您刚刚保存了用户 #1”。所以这是可能的,但我仍在研究如何在不扩展通用视图的情况下做到这一点。我对 Django 和 python 还是很陌生,所以通过 Django 核心来了解他们是如何做到的对我来说并不容易。

          【讨论】:

            【解决方案6】:

            我会推荐使用用于一次性通知消息的 Django 消息框架。

            https://docs.djangoproject.com/en/1.8/ref/contrib/messages/

            【讨论】:

              最近更新 更多