来自 <http://www.ccpt.cc/django_use_messages/>
先简单说一下这里的消息提示是什么意思,以及其被需求的程度。比如你上一个任何一个网站,当你进行某项操作(例如提交表单或者删除一个好友等),网站可能会弹出一个消息框,告诉你你完成了某项操作;相反的,当你进行某项非法操作时,比如你在电话号码的输入框里输入了你的邮箱,人性化的网站也许会友好地弹出个框告诉你,你的操作有误。上面两个例子共同告诉了我们什么是消息提示,以及闭上眼睛我们都能想像它的重要性。
先说说之前没有接触Django中Messages模块时我的实现方法。我们都知道,Django里的一个页面和views.py中的一个函数有着密不可分的关系,甚至大部分情况是一个页面对应一个函数,所以呢?我在需要显示消息提示的页面所对应的函数里维护一个error或者messages的变量,然后在模板渲染时,也就是template文件中,对error和messages进行判断,有则显示,反之忽略。这样的方法虽然笨,但是许多情况还是能符合我的要求的,但是直到…
比如说,现在有这么个需求,我在网站注册账号,账号注册之后紧接着我想“完成注册的用户”顺理成章地进入“编辑头像的页面”,但是我的笨方法只能在当前页面显示当前页面的信息,而我想做的是,在跳转到“编辑头像页面”之后在顶端显示其已经成功注册账号,并欢迎他编辑头像。没有想明白?说白了,我想做的就是在一个页面显示另一个页面的消息提示,而我的之前惯用的方法不可行!
所以我介绍一下DjangoMessages模块的用法,因为它确实实用,前面这么多废话也是想让大家明白它的使用场景。
使用前的准备
这是系统自带的模块,因此倘若你没对settings.py文件没做过什么修改,否则保证下面的字段存在即可;
INSTALLED_APPS {
...
'django.contrib.messages',
...
}
MIDDLEWARE_CLASSES中 {
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
...
}
接着你得确保,你在引用任何messages的地方包含fromdjango.contrib import messages…
在views.py中操作
messages默认有几种类型,比如success,info,error,warning等,当然你也可以自定义一种类型。messages有两种添加方式,你可以在任何你想要显示消息提示的地方使用下面两种方法的任意一种.就是这么简单~
# method #1
messages.success(request,'Hello world.')
messages.error(request,'I am wrong')
# method #2
messages.add_message(request,messages.SUCCESS, 'Hello world.')
如何显示messages
个人认为作为一个网站而言,如何显示消息提示如果能做到统一格式将会是一件好事,你觉得?因此我的想法是这样的,每次有消息提示时我都让它显示在网站顶端几秒钟,然后慢慢渐隐掉,但是根据不同的消息类型显示不同的消息背景色,比如错误消息用黑色,成功消息用绿色,警告用红色等等.下面告诉大家怎么做.
这种整个网站都需要的渲染显然得放在template的base.html里对吧~?在body标签内添加如下代码,messages.tags是消息格式,如果是sucess消息,则其值为success,其他类同:
{% if messages %}
<ulclass="messages">
{%for message in messages %}
<li{%if message.tags %} class="{{ message.tags }}"{% endif %}>{{message }}</li>
{%endfor %}
</ul>
{% endif %}
渲染不同类型messages
到目前为止,我们让不同的消息都能显示在页面上了~但是我们得根据不同的消息用不同的渲染啊(如同我用不同的背景色一样)
.messages {
/*Your code */
}
.messages .success {
/*Your code, e.g. background: green */
}
.messages .error {
/*Your code, e.g. background: black */
}
.messages .warning {
/*Your code, e.g. background: red */
}
大家能做的显然不止这样!我们可以给消息提示添加炫丽的动画效果,那得发挥设计能力以及写js代码了…
再复杂一点点
除了上面的说的可以自定义消息类型,我们还可以屏蔽某些种类的消息等等,这些功能你得自己去挖掘啦~