我有一个接受表单提交并更新模型的视图。
更新模型后,我想重定向到另一个页面,我想在此页面上显示“Field X successfully updated”等消息。
如何将此邮件“传递”到其他页面? HttpResponseRedirect仅接受URL。我之前在其他网站上看到过这个。这是如何完成的?
答案 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中传递) - 只需将实际文本更改为预定义文本消息集中的编码文本即可。
这里有两个优点:
其他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使用的解决方案不那么具有侵入性,可以在不修改代码的情况下使用。传递消息时,您可以在处理消息的视图中更新上下文,并在模板中显示消息。
我使用了相同的方法,但是传递了一个简单的文本,为我传递了一个包含有用字段信息的字典。然后在视图中,更新上下文,然后返回带有更新上下文的呈现模板。
简单,有效且非常不引人注目。