我有一个视图,它执行某个任务并返回到另一个呈现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))
Run Code Online (Sandbox Code Playgroud)
成功完成第一个视图后,我想传递"成功"消息overview.html.有很多重定向要success查看.我只想在浏览第一个视图时传输消息.我怎样才能做到这一点?
And*_*röm 19
添加更详细的答案.
1:在settings.py中配置消息存储:
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
Run Code Online (Sandbox Code Playgroud)
或者如果您不使用会话,请使用CookieStorage:
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.CookieStorage'
Run Code Online (Sandbox Code Playgroud)
2:在您的视图中,导入django.contrib.messages:
from django.contrib import messages
Run Code Online (Sandbox Code Playgroud)
3:在返回HttpResonse之前设置消息数据:
messages.success(request, 'Changes successfully saved.')
Run Code Online (Sandbox Code Playgroud)
这是一个简写:
messages.add_message(request, messages.SUCCESS, 'Changes successfully saved.')
Run Code Online (Sandbox Code Playgroud)
然后可以在模板中使用消息标记(本例中为messages.SUCCESS),即添加相应的CSS类或隐藏调试消息.Django默认包含一些,但如果您希望将它与Bootstrap的默认警报类一起使用,则需要为缺少的警报类添加一些自定义消息标记.
4:在模板中,如果使用Bootstrap警报,则可以使用这样的消息:
{% if messages %}
{% for message in messages %}
<div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
例如,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 %}
Run Code Online (Sandbox Code Playgroud)
使用 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())
Run Code Online (Sandbox Code Playgroud)
我花了几个小时来理解这一点......
from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17726 次 |
| 最近记录: |