【问题标题】:How to pass information using an HTTP redirect (in Django)如何使用 HTTP 重定向传递信息(在 Django 中)
【发布时间】:2010-10-10 14:25:36
【问题描述】:

我有一个接受表单提交并更新模型的视图。

更新模型后,我想重定向到另一个页面,我希望在这个页面上出现“字段X成功更新”之类的消息。

如何将这条消息“传递”到其他页面? HttpResponseRedirect 只接受URL。我以前在其他网站上看到过这样做。这是如何实现的?

【问题讨论】:

  • 我认为这个问题在所有框架中都很常见,并不局限于django/python。
  • @Jiri,是的,但有些框架提供了支持。
  • 在您要重定向到的 url 的查询字符串中编码消息。应该适用于任何框架。

标签: python django http


【解决方案1】:

这是 Django 的一个内置功能,称为“消息”

http://docs.djangoproject.com/en/dev/topics/auth/#messages

来自文档:

一条消息与一个用户相关联。 没有到期的概念或 时间戳。

消息由 Django 管理员使用 行动成功后。例如, “民意调查 Foo 已创建 成功。”是一条消息。

【讨论】:

  • 此功能不需要经过身份验证的用户吗?或者 Django 是否支持匿名/未经身份验证的用户?
  • 不需要经过身份验证的用户。消息附加到的“用户”对象可以是匿名用户; django 根据为该访问者启动的会话创建一个用户对象。唯一的要求是您的访问者允许使用 cookie。
  • @Jarret 和 @S.Lott 是错误的。 Django 的内置消息不是基于会话的,它们由数据库支持并绑定到实际的数据库用户对象(数据库中不存在“匿名”用户),因此它们仅可用于经过身份验证的用户。试试 django-flashcookie 或 django-session-messages。
  • 不适用于匿名用户。另外,它已被弃用。
  • Django的trunk版(未来1.2)支持向匿名用户发送消息
【解决方案2】:

您可以使用 django-flashcookie 应用程序 http://bitbucket.org/offline/django-flashcookie/wiki/Home

它可以发送多条消息并且有无限类型的消息。假设您想要一种用于警告的消息类型和一种用于错误消息的消息类型,您可以编写

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    return HttpResponseRedirect("/")

def simple_action(request):
    ...
    request.flash['error'] = 'something wrong'
    return HttpResponseRedirect("/")

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    request.flash['error'] = 'something wrong'
    return HttpResponseRedirect("/")

甚至

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    request.flash['notice'] = 'Hello World 2'
    request.flash['error'] = 'something wrong'
    request.flash['error'] = 'something wrong 2'
    return HttpResponseRedirect("/")

然后在你的模板中显示它

{% for message in flash.notice %}
    {{ message }}
{% endfor }}

{% for message in flash.notice %}
    {{ message }}
{% endfor }}
{% for message in flash.error %}
    {{ message }}
{% endfor }}

【讨论】:

    【解决方案3】:

    我喜欢使用消息框架的想法,但 django 文档中的示例在上述问题的上下文中对我不起作用。

    真正让我烦恼的是 django 文档中的一行:

    If you're using the context processor, your template should be rendered with a RequestContext. Otherwise, ensure messages is available to the template context.

    这对于新手(比如我)来说是无法理解的,需要扩展,最好是这两个选项的样子。

    我只能找到需要使用 RequestContext 进行渲染的解决方案...无法回答上述问题。

    我相信我已经为下面的第二个选项创建了一个解决方案:

    希望这对其他人有帮助。

    == urls.py ==

    from django.conf.urls.defaults import *
    from views import *
    
    urlpatterns = patterns('',
        (r'^$', main_page, { 'template_name': 'main_page.html', }, 'main_page'),
        (r'^test/$', test ),
    

    == viewtest.py ==

    from django.contrib import messages
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    
    def test(request):
        messages.success( request, 'Test successful' )
        return HttpResponseRedirect( reverse('main_page') )
    

    == viewmain.py ==

    from django.contrib.messages import get_messages
    from django.shortcuts import render_to_response
    
    def main_page(request, template_name ):
        # create dictionary of items to be passed to the template
        c = { messages': get_messages( request ) }
    
        # render page
        return render_to_response( template_name, c, )
    

    == main_page.html ==

    {% block content %}
        {% if messages %}
        <div>
            {% for message in messages %}
                <h2 class="{{message.tag}}">{{ message.message }}</h2>
            {% endfor %}
        </div>
        {% endif %}
    {% endblock %}
    

    【讨论】:

      【解决方案4】:

      我已阅读并检查了所有答案,在我看来,现在要走的路是使用the messaging framework。一些回复相当陈旧,在发帖时可能是正确的方式。

      【讨论】:

        【解决方案5】:

        有很多解决方案

        1 使用 Django-trunk 版本 - 它支持向匿名用户发送消息

        2 次会议

        def view1(request):
            request.session['message'] = 'Hello view2!'
            return HttpResponseRedirect('/view2/')
        
        
        def view2(request):
            return HttpResponse(request.session['message'])
        

        3 带参数的重定向

        return HttpResponseRedirect('/view2/?message=Hello+view2')
        

        4 个 Cookie

        【讨论】:

          【解决方案6】:

          您可以将消息作为查询参数传递到您要重定向到的 URL 上吗?它不是非常 RESTy,但它应该可以工作:

          return HttpResponseRedirect('/polls/%s/results/?message=Updated" % p.id)
          

          并让该视图检查消息参数,擦洗它是否有脏东西,并将其显示在顶部。

          【讨论】:

            【解决方案7】:

            我认为这段代码应该适合你

            request.user.message_set.create(message="This is some message")
            return http.HttpResponseRedirect('/url')
            

            【讨论】:

              【解决方案8】:
              【解决方案9】:

              您还可以将重定向 url 设置为已参数化视图的路径。

              urls.py:

              (r'^some/path/(?P<field_name>\w+)/$', direct_to_template,
                  {'template': 'field_updated_message.html',
                  },
                  'url-name'
              ),
              

              views.py:

              HttpResponseRedirect( reverse('url-name', args=(myfieldname,)) )
              

              注意 args= 需要一个元组。

              【讨论】:

                【解决方案10】:

                Pydev UA 使用的解决方案侵入性较小,无需修改代码中的任何内容即可使用。当您传递消息时,您可以在处理消息的视图中更新您的上下文,并在您的模板中显示它。

                我使用了相同的方法,但是传递了一个简单的文本,传递了一个字典,其中包含对我有用的字段中的信息。然后在视图中,更新上下文,然后返回带有更新上下文的渲染模板。

                简单、有效且非常不显眼。

                【讨论】:

                  【解决方案11】:

                  虽然到目前为止所有建议都有效,但我建议使用 Ry4an(在请求 URL 中传递它) - 只需将实际文本更改为预定义文本消息集中的编码文本。

                  这里有两个优点:

                  1. 通过清理不良内容进行黑客攻击的可能性较小
                  2. 如果需要,您可以稍后本地化您的消息。

                  其他与 cookie 相关的方法.. 好吧,如果浏览器不支持 cookie,它们就不起作用,而且稍微贵一些.. 但只是稍微贵一点。它们确实更干净。

                  【讨论】:

                  • 我真的不喜欢通过 URL 传递用户消息的想法——它只会破坏 Django 的整洁度
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-30
                  • 2012-06-06
                  • 1970-01-01
                  • 2016-03-08
                  • 2018-08-05
                  • 2021-12-03
                  相关资源
                  最近更新 更多