在Django中使用HttpResponseRedirect时如何传递模板上下文信息?

时间:2009-09-23 01:19:17

标签: python django http redirect

我有一个表单,在用户输入信息后重定向到同一页面(以便他们可以继续输入信息)。如果表单提交成功,我将返回

HttpResponseRedirect(request.path)

工作正常。但是,在这种情况下,我还想向用户显示一些消息(例如,屏幕顶部的“您的数据已保存”)。如果我没有重定向,我只是在上下文字典中返回这些消息。但是,通过重定向,我无法做到这一点。

那么在使用HttpResponseRedirect时如何传递模板上下文信息?

我想做的事情似乎非常普遍,所以如果我遗漏了一些明显的东西,请原谅。

7 个答案:

答案 0 :(得分:53)

为了完成和将来参考,您现在可以使用the messages framework。安装后:

<强> views.py

from django.contrib import messages

def view(request):
  # your code
  messages.success(request, "Your data has been saved!")
  HttpResponseRedirect(request.path)

<强> template.html

{% if messages %}
<ul class="messages">
  {% for message in messages %}
  <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
  {% endfor %}
</ul>
{% endif %}

答案 1 :(得分:10)

如果您正在使用身份验证并拥有登录用户,则可以:

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

GET params也是可以破解的。可以使用其他答案中提到的查询字符串。

我认为最优选的方式是使用会话框架。这样你可以在上下文中加载你想要的任何内容并获得

{{ request.session.foo }} 

foo可能是您要做的信息:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %}

和其他有趣的东西。

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

答案 2 :(得分:7)

最好的方法可能是在重定向网址上使用编码的查询字符串......这是一种老式的方法。

您可以执行类似

的操作

/ page /?m = 1,/ page /?m = 2等

然后,您将在视图代码中使用request.GET解析该变量,并显示相应的消息。

答案 3 :(得分:6)

你做不到。 HttpResponseRedirect向浏览器发送客户端重定向(HTTP状态代码302),然后浏览器重新请求另一个页面。

您可以在重定向上设置URL查询字符串,但这对用户和任何拦截HTTP请求(即代理)的人都是可见的,因此不适合敏感信息。

答案 4 :(得分:1)

我知道通过重定向传递任何数据的唯一方法是将GET参数添加到您传入的URL中。为了避免XSS黑客,您需要传递特定的常量,如:

[你传入的当前路径]?message =已保存

然后在处理程序中处理传递的路径中的message = saved参数。

更复杂的方法是不在重定向中传递数据,而是使用类似http://code.google.com/p/django-notify/的内容来存储重定向后显示给用户的基于会话的数据。

答案 5 :(得分:1)

从您的views.py中,您必须将一个键/值对放入会话中,然后从HTML模板中读取它。

例如:

<强> views.py

# your code here
request.session['vote'] = 1
return HttpResponseRedirect(request.path)

<强> your_template.html

{% ifequal request.session.vote 1 %}
    <!-- Your action here -->
{% endifequal  %}

答案 6 :(得分:0)

您将?saved = 1添加到查询字符串中,并使用以下内容检查:

saved = request.GET.get('saved', False)