我有一个视图执行某项任务并返回另一个呈现hello.html模板的视图。
def 1stview(request):
#Do this
#Do that
return HttpResponseRedirect('/success/')
def success(request):
return render_to_response('overview.html', {'overview_files': b, 'total_files':total_files, 'total_size':total_size, 'username': username}, context_instance=RequestContext(request))
成功完成第一个视图后,我想在overview.html
中传递“成功”消息。有很多重定向到success
视图。我只想在浏览第一个视图时传输消息。我怎么能这样做?
答案 0 :(得分:18)
使用messages framework在页面请求之间发送消息。
答案 1 :(得分:12)
添加更详细的答案。
1:在 settings.py 中配置信息存储空间:
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
或者如果您不使用会话,请使用CookieStorage:
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.CookieStorage'
2:在您看来,导入 django.contrib.messages :
from django.contrib import messages
3:在返回HttpResonse之前设置消息数据:
messages.success(request, 'Changes successfully saved.')
这是:
的简写messages.add_message(request, messages.SUCCESS, 'Changes successfully saved.')
然后可以在模板中使用消息标记(在本例中为 messages.SUCCESS ),即添加相应的CSS类或隐藏调试消息。 Django默认包含一些,但是如果您希望将它与Bootstrap的默认警报类一起使用,则需要为缺少的警报类添加一些自定义message tags。
4:在模板中,如果使用Bootstrap警报,则可以使用这样的消息:
{% if messages %}
{% for message in messages %}
<div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
{% endfor %}
{% endif %}
例如,Django使用'error'作为ERROR的默认标记,而Bootstrap使用危险来指示错误。最好的解决方案是使用自定义标签,但您也可以在模板中进行monkeypatch(丑陋的解决方案):
{% if messages %}
{% for message in messages %}
<div class="alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
{% endfor %}
{% endif %}
答案 2 :(得分:2)
from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')
答案 3 :(得分:2)
使用i18n 网址时要小心!如果您使用/whatever/
之类的链接但使用国际化,则会重定向到/en/whatever/
,从而丢失请求中的消息。如果您使用国际化,请始终将语言传递给URL:
from django.contrib import messages
from django.utils.translation import get_language
messages.success(request, _('Thank you'))
return redirect('/%s/whatever/' % get_language())
花费我几个小时来理解这一点......