Post

【Django】消息框架

在web应用中,经常需要在处理完一个表单或其他用户输入后,向用户显示一条一次性的通知消息。为此,Django提供了消息框架,可以在请求中临时存储消息,并在响应或后续请求中获取并显示。

官方文档:https://docs.djangoproject.com/en/stable/ref/contrib/messages/

1.配置

1.1 启用消息框架

startproject命令创建的默认设置文件已经包含了启用消息框架需要的所有配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INSTALLED_APPS = [
    ...
    'django.contrib.messages',
]

MIDDLEWARE = [
    ...
    'django.contrib.messages.middleware.MessageMiddleware',
]

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

1.2 存储后端

消息框架可以使用不同的存储后端。Django提供了三个内置的存储类:SessionStorageCookieStorageFallbackStorage(默认),可以通过MESSAGE_STORAGE设置指定。例如:

1
MESSAGE_STORAGE = "django.contrib.messages.storage.cookie.CookieStorage"

1.3 消息级别

消息有一个级别(类似于Python日志模块),可用于对消息进行过滤。内置级别包括DEBUGINFOSUCCESSWARNINGERROR,可以从django.contrib.messages导入。

可以使用MESSAGE_LEVEL设置指定消息的最小级别,小于这个级别的消息将被忽略。

1.4 消息标签

消息标签是消息级别的小写形式字符串表示(如'info'),也可以在视图中添加额外的标签。标签存储在字符串中,用空格分隔。消息标签通常用作CSS类以自定义消息样式。

2.使用消息

2.1 添加消息

在视图中,调用add_message()函数添加一条消息。例如:

1
2
3
from django.contrib import messages

messages.add_message(request, messages.INFO, "Hello world.")

每种级别都有对应的快捷方法(类似于日志API),例如messages.info()

2.2 显示消息

在模板中,可以使用messages变量获取消息:

1
2
3
4
5
6
7
{% if messages %}
    <ul class="messages">
    {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
    </ul>
{% endif %}

在视图中,可以使用get_messages()

1
2
3
4
5
from django.contrib.messages import get_messages

storage = get_messages(request)
for message in storage:
    do_something_with_the_message(message)

当消息被迭代后,就会在响应处理完成时清除。

This post is licensed under CC BY 4.0 by the author.