如何使用HTTP重定向传递信息(在Django中)

时间:2009-03-01 05:02:13

标签: python django http

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

更新模型后,我想重定向到另一个页面,我想在此页面上显示“Field X successfully updated”等消息。

如何将此邮件“传递”到其他页面? HttpResponseRedirect仅接受URL。我之前在其他网站上看到过这个。这是如何完成的?

11 个答案:

答案 0 :(得分:12)

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

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

来自文档:

  

消息与用户相关联。   没有过期或过期的概念   时间戳。

     

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

答案 1 :(得分:8)

您可以使用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 }}

答案 2 :(得分:5)

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

令我恼火的是django docs中的界限:

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

有很多解决方案

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 Cookies

答案 5 :(得分:1)

您是否可以将邮件作为查询参数传递到您要重定向的网址?它不是非常RESTy,但它应该工作:

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

并让该视图检查消息参数,将其擦除为恶意,然后将其显示在顶部。

答案 6 :(得分:1)

我认为此代码适合您

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

答案 7 :(得分:0)

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

这里有两个优点:

  1. 通过清除不良内容来减少黑客入侵的可能性
  2. 如果需要,您可以稍后本地化您的邮件。
  3. 其他cookie相关的方法..好吧,如果浏览器不支持cookie,它们不起作用,并且稍微贵一些..但只是略有一点。它们确实更清洁。

答案 8 :(得分:0)

答案 9 :(得分:0)

您还可以将重定向网址作为已参数化视图的路径。

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 :(得分:0)

Pydev UA使用的解决方案不那么具有侵入性,可以在不修改代码的情况下使用。传递消息时,您可以在处理消息的视图中更新上下文,并在模板中显示消息。

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

简单,有效且非常不引人注目。