django messages 消息使用

作者 夜狼荼 2019年02月22日 02:58 阅读 1010

官方文档:https://docs.djangoproject.com/zh-hans/2.1/ref/contrib/messages/

一.启用消息框架

django-admin startproject 创建的默认settings.py 已经包含启用消息框架功能需要的所有的设置:

  • INSTALLED_APPS 中的django.contrib.messages

  • MIDDLEWARE_CLASSES 中的django.contrib.sessions.middleware.SessionMiddlewaredjango.contrib.messages.middleware.MessageMiddleware

  • TEMPLATES 设置中定义的DjangoTemplates 的context_processors 选项包含django.contrib.messages.context_processors.messages

默认的后端存储 依赖sessions。所以MIDDLEWARE_CLASSES 中必须启用SessionMiddleware 并出现在MessageMiddleware 之前。

如果你不想使用消息框架,你可以删除INSTALLED_APPS 中的 'django.contrib.messages'、MIDDLEWARE_CLASSES 中的MessageMiddleware 和TEMPLATES 中的messages context processo

配置消息框架引擎

消息框架可以使用不同的后台存储临时消息。

Django 在django.contrib.messages 中提供三个内建的存储类:

class storage.session.SessionStorage 这个类存储所有的消息于请求的会话中。因此,它要求启用Django 的contrib.sessions 应用。

class storage.cookie.CookieStorage 这个类存储消息数据于与Cookie 中(已经用一个安全的哈希进行签名以防止篡改)以在请求之间传递消息。如果Cookie 数据的大小将超过2048 字节,将丢弃旧的消息。

class storage.fallback.FallbackStorage 这个类首先使用CookieStorage,如果消息塞不进一个Cookie 中则使用SessionStorage。 它同样要求启用Django 的contrib.sessions 应用。

这个行为避免每次都写会话。在通常情况下,它提供的性能应该是最好的。

FallbackStorage 是默认的存储类。如果它不适合你的需要,你可以通过设置 MESSAGE_STORAGE 为它的完整导入路径选择另外一个存储类,例如:

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

消息级别

级别的作用就是根据消息类型进行分组,这样它们能够在不同的视图和模板中过滤或显示出来

django.contrib.messages 导入的内建级别有:

| 常量 | 用途 | | :------------: | :------------: | | DEBUG | 将在生产部署中忽略(或删除)的与开发相关的消息 | | INFO | 为用户提供的信息消息 | | SUCCESS | 执行成功消息。“您的个人资料更新成功” | | WARNING | 错误没有发生,但可能即将发生 | | ERROR | 执行失败或错误 |

举例如下:

messages.debug(request, '执行%s条SQL语句.' % count)
messages.info(request, '你的账户上还有三个学分.')
messages.success(request, '更新配置文件成功.')
messages.warning(request, '你的帐户三天内到期.')
messages.error(request, '文件删除.')

在视图及模板中使用

add_message(request, level, message, extra_tags='', fail_silently=False)

例:新增消息

from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')

显示消息

get_messages(request)

在你的模板中,可以像下面这样使用:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

发表评论