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

Posted

技术标签:

【中文标题】在 Django 中使用 HttpResponseRedirect 时如何传递模板上下文信息?【英文标题】:How do I pass template context information when using HttpResponseRedirect in Django? 【发布时间】:2010-11-30 14:43:22 【问题描述】:

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

HttpResponseRedirect(request.path)

效果很好。但是,在这种情况下,我还想向用户显示一些消息(例如,屏幕顶部的“您的数据已保存”)。如果我不重定向,我只会在上下文字典中返回这些消息。但是,使用重定向,我不能这样做。

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

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

【问题讨论】:

似乎第二个页面的加载发生在来自浏览器的另一个单独请求之后(第一个响应返回 302),因此您无法像您可能期望使用的那样在视图之间来回传递信息HttpResponse重定向。恕我直言,会话框架是在请求之间传递信息的最简单方法。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

[您传入的当前路径]?message=saved

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

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

【讨论】:

【参考方案4】:

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

你可以这样做

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

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

【讨论】:

【参考方案5】:

如果你正在使用 auth 并且有一个登录用户,你可以:

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

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

我认为最首选的方法是使用会话框架。这样你就可以在上下文中加载任何你想要的东西并得到

 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

【讨论】:

如 request.session['foo'] = 1 ? 是的,对于第二个模板代码。或者,对于第一个模板 sn-p,您可以根据逻辑将整个消息放在那里。 我从来没有意识到在 Django 中使用会话是多么容易......感谢您提出这个建议。这个方法我用过,效果很好。【参考方案6】:

从您的 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  %

【讨论】:

一个旧答案,但我怀疑这样的问题可以用于我在这里提出的问题:***.com/questions/41317128/… 如果你有时间,很想听听你的想法:-)跨度> 【参考方案7】:

为了完成和将来参考,您现在可以使用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 %

【讨论】:

以上是关于在 Django 中使用 HttpResponseRedirect 时如何传递模板上下文信息?的主要内容,如果未能解决你的问题,请参考以下文章

django的HttpResponse对象

13-Django-基础篇-HttpResponse对象

django.http.response中HttpResponse 子类

在 django 1.5 CBV 中返回 HttpResponse 时的 simplejson 错误

Django HttpResponse

django HttpResponse对象