首页 文章

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

提问于
浏览
37

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

HttpResponseRedirect(request.path)

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

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

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

7 回答

  • 52

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

    你可以做点什么

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

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

  • 6

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

    如果您使用auth并拥有登录用户,您可以:

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

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

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

    {{ 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

  • 7

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

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

  • 1

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

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

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

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

  • 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  %}
    
  • 0

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

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

相关问题