2009-09-23 90 views
31

我有一个表单在用户输入信息后重定向到同一页面(以便他们可以继续输入信息)。如果表单提交成功,我将返回在Django中使用HttpResponseRedirect时,如何传递模板上下文信息?

HttpResponseRedirect(request.path) 

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

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

我想要做的事情似乎会非常普遍,所以请原谅我是否缺少明显的东西。

+0

在这些登录的用户? – 2009-09-23 03:37:13

+0

似乎第二个页面的加载发生在来自浏览器的另一个单独请求之后(第一个响应返回302),因此您不能在视图之间来回传递信息,就像您期望使用HttpResponseRedirect一样。恕我直言,会议框架是在请求之间传递信息的最简单方式。 – 2012-03-03 03:04:27

回答

5

最好的方法可能是在重定向URL上使用编码查询字符串......它是一种老派的方法。

你可以做类似

/页/?M = 1,/页/?M = 2等

然后,您可以解析变量,在request.GET中视图代码,并显示适当的消息。

6

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

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

+2

会话框架呢? – 2009-09-23 20:39:03

0

您添加保存= 1到查询字符串,并检查它的东西,如:

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

我知道要通过什么数据与重定向的唯一方式是让参数添加到URL你传递以避免XSS黑客你想传递像一个特定的常数:?

[你传递在当前路径]消息=保存

,然后处理消息=保存的参数在你通过的路径的处理程序中。

稍微复杂一点的方式是不会将数据传递到重定向中,而是使用类似http://code.google.com/p/django-notify/的东西来存储基于会话的数据,这些数据在重定向后显示给用户。

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

+0

如request.session ['foo'] = 1?对于第二个模板代码,是 – 2011-09-09 15:04:51

+0

是的。或者,对于第一个模板片段,您可以根据逻辑将整个消息放在那里。 – 2011-09-09 15:28:40

+0

我从来没有意识到在Django中使用会话有多简单......感谢您提出这个建议。我已经使用这种方法,它工作得很好。 – nicorellius 2014-02-20 04:06:03

0

从你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 %} 
+0

旧的答案,但我怀疑这样的事情可以用于我在这里问的问题:http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has如果你有时间的话,很想听听你的想法:-) – 2016-12-24 22:35:03

45

完成和将来参考的缘故,你现在可以使用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 %} 
相关问题