{"title":"消息框架","version":"4.1","locale":"zh-hans","docname":"ref/contrib/messages","url":"/zh-hans/4.1/ref/contrib/messages/","canonical":"https://djangodocs.dev/zh-hans/4.1/ref/contrib/messages/","summary":"在网页应用中，相当常见的是，你需要在处理完一个表单或一些其他类型的用户输入后，向用户显示一个一次性的通知消息（也称为“即时消息”）。 为此，Django 为匿名用户和认证用户提供了对基于 cookie…","html":"<span id=\"the-messages-framework\"></span><h1>消息框架<a class=\"heading-anchor\" href=\"#module-django.contrib.messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>在网页应用中，相当常见的是，你需要在处理完一个表单或一些其他类型的用户输入后，向用户显示一个一次性的通知消息（也称为“即时消息”）。</p>\n<p>为此，Django 为匿名用户和认证用户提供了对基于 cookie 和会话的消息传递的全面支持。消息框架允许你在一个请求中临时存储消息，并在随后的请求（通常是下一个请求）中检索显示。每条消息都有一个特定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> 标签，以确定其优先级（例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">info</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">warning</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">error</span></code>）。</p>\n<section id=\"enabling-messages\">\n<h2>启用消息<a class=\"heading-anchor\" href=\"#enabling-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>消息是通过一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/middleware/\"><span class=\"doc\">中间件</span></a> 类和相应的 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/templates/api/\"><span class=\"doc\">上下文处理器</span></a> 来实现的。</p>\n<p>由 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code> 创建的默认 <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> 已经包含了启用消息功能所需的所有配置：</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages'</span></code> 在 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 中。</p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.session.middleware.SessionMiddleware'</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.message.middleware.MessageMiddleware'</span></code>。</p>\n<p>默认的 <a class=\"reference internal\" href=\"#message-storage-backends\"><span class=\"std std-ref\">存储后端</span></a> 依赖于 <a class=\"reference internal\" href=\"/zh-hans/4.1/topics/http/sessions/\"><span class=\"doc\">会话</span></a>。这就是为什么 <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 必须被启用，并且出现在 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 中 <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageMiddleware</span></code> 之前。</p>\n</li>\n<li><p>在你的 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> 配置中定义的 <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> 后端的 <code class=\"docutils literal notranslate\"><span class=\"pre\">''context_processors'</span></code> 选项中包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages.context_processors.messages'</span></code>。</p></li>\n</ul>\n<p>如果你不想使用消息，你可以从你的 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 中删除 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages'</span></code>，从 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 中删除 <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageMiddleware</span></code> 行，从 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> 中删除 <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> 上下文处理器。</p>\n</section>\n<section id=\"configuring-the-message-engine\">\n<h2>设置消息引擎<a class=\"heading-anchor\" href=\"#configuring-the-message-engine\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"storage-backends\">\n<span id=\"message-storage-backends\"></span><h3>存储后端<a class=\"heading-anchor\" href=\"#storage-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>消息框架可以使用不同的后端来存储临时消息。</p>\n<p>Django 在 <a class=\"reference internal\" href=\"#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.messages</span></code></a> 中提供了三个内置的存储类。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.storage.session.SessionStorage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">storage.session.</span></span><span class=\"sig-name descname\"><span class=\"pre\">SessionStorage</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.storage.session.SessionStorage\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个类在请求的会话中存储所有的消息。因此它需要 Django 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.session</span></code> 应用。</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.storage.cookie.CookieStorage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">storage.cookie.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CookieStorage</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.storage.cookie.CookieStorage\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>该类将消息数据存储在 cookie 中（用密钥哈希签名，以防止被篡改），以便在不同的请求中持久保存通知。如果 cookie 数据大小超过 2048 字节，旧的消息就会被删除。</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.storage.fallback.FallbackStorage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">storage.fallback.</span></span><span class=\"sig-name descname\"><span class=\"pre\">FallbackStorage</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.storage.fallback.FallbackStorage\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个类首先使用了 <code class=\"docutils literal notranslate\"><span class=\"pre\">CookieStorage</span></code>，然后又回到了使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStorage</span></code> 来处理无法放入单个 cookie 的消息。它也需要 Django 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.session</span></code> 应用。</p>\n<p>这种行为尽可能避免向会话写入。在一般情况下，它应该提供最好的性能。</p>\n</dd></dl>\n\n<p><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FallbackStorage</span></code> 是默认的存储类。如果它不适合你的需求，你可以通过设置 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_STORAGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_STORAGE</span></code></a> 到它的完整导入路径来选择其他存储类，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MESSAGE_STORAGE</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;django.contrib.messages.storage.cookie.CookieStorage&#39;</span>\n</code></pre></div>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.storage.base.BaseStorage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">storage.base.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseStorage</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.storage.base.BaseStorage\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>要编写自己的存储类，请将 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.messages.storage.base</span></code> 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseStorage</span></code> 类子类化，并实现 <code class=\"docutils literal notranslate\"><span class=\"pre\">_get</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">_store</span></code> 方法。</p>\n</section>\n<section id=\"message-levels\">\n<span id=\"message-level\"></span><h3>消息级别<a class=\"heading-anchor\" href=\"#message-levels\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>消息框架是基于一个类似于 Python 日志模块的可配置级别架构。消息级别允许你按类型对消息进行分组，以便在视图和模板中以不同的方式对它们进行过滤或显示。</p>\n<p>可以直接从 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.messages</span></code> 导入的内置级别有：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>常量</p></th>\n<th class=\"head\"><p>目的</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></p></td>\n<td><p>与开发相关的消息，在生产部署中将被忽略（或删除）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code></p></td>\n<td><p>给用户的参考消息</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SUCCESS</span></code></p></td>\n<td><p>一个动作成功了，例如：“您的资料更新成功”</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code></p></td>\n<td><p>未发生的故障，但可能即将发生</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code></p></td>\n<td><p>某项动作 <strong>没有</strong> 成功或发生了其他故障</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_LEVEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_LEVEL</span></code></a> 的配置可以用来改变最小记录级别（或者可以 <a class=\"reference internal\" href=\"#changing-the-minimum-recorded-level-per-request\">按请求改变</a> ）。试图添加小于这个级别的信息将被忽略。</p>\n</section>\n<section id=\"message-tags\">\n<h3>消息标签<a class=\"heading-anchor\" href=\"#message-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>消息标签是消息级别的字符串表示，加上任何直接在视图中添加的额外标签（更多细节请参见下面的 <a class=\"reference internal\" href=\"#adding-extra-message-tags\">添加额外的消息标签</a> ）。标签存储在一个字符串中，并由空格分隔。通常情况下，消息标签被用作 CSS 类，以根据消息类型自定义消息样式。默认情况下，每个级别都有一个单独的标签，它是自己常量的小写版本。</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>消息常量</p></th>\n<th class=\"head\"><p>标签</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">info</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SUCCESS</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">warning</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">error</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>要更改消息级别（内置或自定义）的默认标签，请将 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> 设置为包含你希望更改的级别的字典。由于这扩展了默认标签，你只需要为你希望覆盖的级别提供标签：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.messages</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">constants</span> <span class=\"k\">as</span> <span class=\"n\">messages</span>\n<span class=\"n\">MESSAGE_TAGS</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n    <span class=\"mi\">50</span><span class=\"p\">:</span> <span class=\"s1\">&#39;critical&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"using-messages-in-views-and-templates\">\n<h2>在视图和模板中使用消息<a class=\"heading-anchor\" href=\"#using-messages-in-views-and-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.add_message\">\n<span class=\"sig-name descname\"><span class=\"pre\">add_message</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">level</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">extra_tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">''</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.messages.add_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<section id=\"adding-a-message\">\n<h3>添加一个消息<a class=\"heading-anchor\" href=\"#adding-a-message\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>要添加一个消息，调用：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">messages</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">add_message</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Hello world.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>一些快捷方法提供了一种添加消息的标准方法，常用的标签（通常表示为消息的 HTML 类）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\"> SQL statements were executed.&#39;</span> <span class=\"o\">%</span> <span class=\"n\">count</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Three credits remain in your account.&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">success</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Profile details updated.&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Your account expires in three days.&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Document deleted.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"displaying-messages\">\n<span id=\"message-displaying\"></span><h3>显示消息<a class=\"heading-anchor\" href=\"#displaying-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.get_messages\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_messages</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.messages.get_messages\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><strong>在你的模板</strong> 中，使用类似：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">messages</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"o\">&lt;</span><span class=\"n\">ul</span> <span class=\"n\">class</span><span class=\"o\">=</span><span class=\"s2\">&quot;messages&quot;</span><span class=\"o\">&gt;</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">for</span> <span class=\"n\">message</span> <span class=\"ow\">in</span> <span class=\"n\">messages</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span><span class=\"n\">li</span><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">message</span><span class=\"o\">.</span><span class=\"n\">tags</span> <span class=\"o\">%</span><span class=\"p\">}</span> <span class=\"n\">class</span><span class=\"o\">=</span><span class=\"s2\">&quot;{{ message.tags }}&quot;</span><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span><span class=\"o\">&gt;</span><span class=\"p\">{{</span> <span class=\"n\">message</span> <span class=\"p\">}}</span><span class=\"o\">&lt;/</span><span class=\"n\">li</span><span class=\"o\">&gt;</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endfor</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"o\">&lt;/</span><span class=\"n\">ul</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>如果你正在使用上下文处理器，你的模板应该用 <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code> 来渲染。否则，确保模板上下文有 <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> 可用。</p>\n<p>即使你知道只有一条消息，你仍然应该遍历 <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> 序列，因为否则消息存储将不会为下一个请求清除。</p>\n<p>上下文处理器还提供了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">DEFAULT_MESSAGE_LEVELS</span></code> 变量，它是消息级别名称与其数值的映射：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">messages</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"o\">&lt;</span><span class=\"n\">ul</span> <span class=\"n\">class</span><span class=\"o\">=</span><span class=\"s2\">&quot;messages&quot;</span><span class=\"o\">&gt;</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">for</span> <span class=\"n\">message</span> <span class=\"ow\">in</span> <span class=\"n\">messages</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span><span class=\"n\">li</span><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">message</span><span class=\"o\">.</span><span class=\"n\">tags</span> <span class=\"o\">%</span><span class=\"p\">}</span> <span class=\"n\">class</span><span class=\"o\">=</span><span class=\"s2\">&quot;{{ message.tags }}&quot;</span><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span><span class=\"o\">&gt;</span>\n        <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">message</span><span class=\"o\">.</span><span class=\"n\">level</span> <span class=\"o\">==</span> <span class=\"n\">DEFAULT_MESSAGE_LEVELS</span><span class=\"o\">.</span><span class=\"n\">ERROR</span> <span class=\"o\">%</span><span class=\"p\">}</span><span class=\"n\">Important</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n        <span class=\"p\">{{</span> <span class=\"n\">message</span> <span class=\"p\">}}</span>\n    <span class=\"o\">&lt;/</span><span class=\"n\">li</span><span class=\"o\">&gt;</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endfor</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"o\">&lt;/</span><span class=\"n\">ul</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n</code></pre></div>\n<p><strong>在模板之外</strong>，你可以使用 <a class=\"reference internal\" href=\"#django.contrib.messages.get_messages\" title=\"django.contrib.messages.get_messages\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_messages()</span></code></a>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.messages</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_messages</span>\n\n<span class=\"n\">storage</span> <span class=\"o\">=</span> <span class=\"n\">get_messages</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n<span class=\"k\">for</span> <span class=\"n\">message</span> <span class=\"ow\">in</span> <span class=\"n\">storage</span><span class=\"p\">:</span>\n    <span class=\"n\">do_something_with_the_message</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>例如，你可以获取所有的消息，以一个 <span class=\"xref std std-ref\">JSONResponseMixin</span> 而不是一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin\" title=\"django.views.generic.base.TemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponseMixin</span></code></a> 来返回它们。</p>\n<p><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_messages()</span></code> 将返回一个配置好的存储后端的实例。</p>\n</section>\n<section id=\"the-message-class\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">Message</span></code> 类<a class=\"heading-anchor\" href=\"#the-message-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.storage.base.Message\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">storage.base.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Message</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.storage.base.Message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当你循环浏览模板中的消息列表时，你得到的是 <code class=\"docutils literal notranslate\"><span class=\"pre\">Message</span></code> 类的实例。它们只有几个属性。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code>：消息的实际内容。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code>：描述消息类型的整数（见上文 <a class=\"reference internal\" href=\"#message-levels\">消息级别</a> 一节）。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>：由消息的所有标签（<code class=\"docutils literal notranslate\"><span class=\"pre\">extra_tags</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">level_tag</span></code>）组成的字符串，用空格分隔。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_tags</span></code>：包含该消息的自定义标签的字符串，用空格隔开。默认为空。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">level_tag</span></code>：级别的字符串表示。默认情况下，它是相关常量名称的小写版本，但如果需要的话，可以使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> 配置来更改。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"creating-custom-message-levels\">\n<h3>创建自定义消息级别<a class=\"heading-anchor\" href=\"#creating-custom-message-levels\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>消息级别不过是整数，所以你可以定义自己的级别常数，并使用它们来创建更多定制化的用户反馈，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CRITICAL</span> <span class=\"o\">=</span> <span class=\"mi\">50</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">add_message</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">CRITICAL</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A serious error occurred.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>当创建自定义消息级别时，你应该注意避免重载现有级别。内置级别的值是：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\" id=\"message-level-constants\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>消息常量</p></th>\n<th class=\"head\"><p>值</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></p></td>\n<td><p>10</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code></p></td>\n<td><p>20</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SUCCESS</span></code></p></td>\n<td><p>25</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code></p></td>\n<td><p>30</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code></p></td>\n<td><p>40</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>如果你需要在你的 HTML 或 CSS 中识别自定义级别，你需要通过 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> 配置提供一个映射。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>如果你正在创建一个可重用的应用程序，建议只使用内置的 <a class=\"reference internal\" href=\"#message-levels\">消息级别</a> ，而不要依赖任何自定义级别。</p>\n</aside>\n</section>\n<section id=\"changing-the-minimum-recorded-level-per-request\">\n<h3>改变每次请求的最低记录级别<a class=\"heading-anchor\" href=\"#changing-the-minimum-recorded-level-per-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">set_level</span></code> 方法为每个请求设置最低记录级别：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">messages</span>\n\n<span class=\"c1\"># Change the messages level to ensure the debug message is added.</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">set_level</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Test message...&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># In another request, record only messages with a level of WARNING and higher</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">set_level</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">WARNING</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">success</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Your profile was updated.&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># ignored</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Your account is about to expire.&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># recorded</span>\n\n<span class=\"c1\"># Set the messages level back to default.</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">set_level</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>同样，当前的有效级别可以用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_level</span></code> 检索：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">messages</span>\n<span class=\"n\">current_level</span> <span class=\"o\">=</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">get_level</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>关于最低记录级别如何发挥作用的更多信息，请参见上文 <a class=\"reference internal\" href=\"#message-levels\">消息级别</a> 。</p>\n</section>\n<section id=\"adding-extra-message-tags\">\n<h3>添加额外的消息标签<a class=\"heading-anchor\" href=\"#adding-extra-message-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>为了更直接地控制消息标签，你可以选择向任何一个添加方法提供一个包含额外标签的字符串：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">add_message</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Over 9000!&#39;</span><span class=\"p\">,</span> <span class=\"n\">extra_tags</span><span class=\"o\">=</span><span class=\"s1\">&#39;dragonball&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Email box full&#39;</span><span class=\"p\">,</span> <span class=\"n\">extra_tags</span><span class=\"o\">=</span><span class=\"s1\">&#39;email&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>额外的标签添加在该级别的默认标签之前，并以空格分隔。</p>\n</section>\n<section id=\"failing-silently-when-the-message-framework-is-disabled\">\n<h3>当消息框架被禁用时静默的失败了<a class=\"heading-anchor\" href=\"#failing-silently-when-the-message-framework-is-disabled\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你正在编写一个可重用的应用程序（或其他代码），并希望包含消息功能，但不想要求用户在不愿意的情况下启用它，你可以传递一个额外的关键字参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently=True</span></code> 到任何 <code class=\"docutils literal notranslate\"><span class=\"pre\">add_message</span></code> 系列方法中。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">add_message</span><span class=\"p\">(</span>\n    <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Profile details updated.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">fail_silently</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Hello world.&#39;</span><span class=\"p\">,</span> <span class=\"n\">fail_silently</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently=True</span></code> 只隐藏 <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageFailure</span></code>，否则当消息框架被禁用，人们试图使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">add_message</span></code> 系列方法之一时，就会发生 <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageFailure</span></code>。它不隐藏可能因其他原因而发生的失败。</p>\n</aside>\n</section>\n<section id=\"adding-messages-in-class-based-views\">\n<h3>在基于类的视图中添加消息<a class=\"heading-anchor\" href=\"#adding-messages-in-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.views.SuccessMessageMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">views.</span></span><span class=\"sig-name descname\"><span class=\"pre\">SuccessMessageMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.views.SuccessMessageMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>为 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FormView</span></code> 基础类添加成功消息属性。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.views.SuccessMessageMixin.get_success_message\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_success_message</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">cleaned_data</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.messages.views.SuccessMessageMixin.get_success_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> 是指表单中干净的数据，用于字符串格式化。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><strong>示例 views.py</strong>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.messages.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SuccessMessageMixin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CreateView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorCreateView</span><span class=\"p\">(</span><span class=\"n\">SuccessMessageMixin</span><span class=\"p\">,</span> <span class=\"n\">CreateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/success/&#39;</span>\n    <span class=\"n\">success_message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(name)s</span><span class=\"s2\"> was created successfully&quot;</span>\n</code></pre></div>\n<p>从 <code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code> 中清理出来的数据可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">%(field_name)s</span></code> 语法进行字符串插值。对于模型表单，如果你需要访问保存的 <code class=\"docutils literal notranslate\"><span class=\"pre\">object</span></code> 中的字段，可以覆盖  <a class=\"reference internal\" href=\"#django.contrib.messages.views.SuccessMessageMixin.get_success_message\" title=\"django.contrib.messages.views.SuccessMessageMixin.get_success_message\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_success_message()</span></code></a> 方法。</p>\n<p><strong>模型表单的示例 views.py</strong>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.messages.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SuccessMessageMixin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CreateView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ComplicatedModel</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ComplicatedCreateView</span><span class=\"p\">(</span><span class=\"n\">SuccessMessageMixin</span><span class=\"p\">,</span> <span class=\"n\">CreateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">ComplicatedModel</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/success/&#39;</span>\n    <span class=\"n\">success_message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(calculated_field)s</span><span class=\"s2\"> was created successfully&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_success_message</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">cleaned_data</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">success_message</span> <span class=\"o\">%</span> <span class=\"nb\">dict</span><span class=\"p\">(</span>\n            <span class=\"n\">cleaned_data</span><span class=\"p\">,</span>\n            <span class=\"n\">calculated_field</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">calculated_field</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"expiration-of-messages\">\n<h2>消息过期<a class=\"heading-anchor\" href=\"#expiration-of-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>这些消息被标记为在存储实例迭代时清除（在处理响应时清除）。</p>\n<p>为了避免消息被清除，可以在迭代后将消息存储设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">storage</span> <span class=\"o\">=</span> <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">get_messages</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n<span class=\"k\">for</span> <span class=\"n\">message</span> <span class=\"ow\">in</span> <span class=\"n\">storage</span><span class=\"p\">:</span>\n    <span class=\"n\">do_something_with</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">)</span>\n<span class=\"n\">storage</span><span class=\"o\">.</span><span class=\"n\">used</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n</section>\n<section id=\"behavior-of-parallel-requests\">\n<h2>并行请求的行为<a class=\"heading-anchor\" href=\"#behavior-of-parallel-requests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>由于 cookie（以及会话）的工作方式，<strong>当同一客户端发出多个请求，并行设置或获取消息时，任何使用 cookie 或会话的后端的行为都是未定义的</strong>。例如，如果客户端发起一个在一个窗口（或标签页）中创建消息的请求，然后在第一个窗口重定向之前发起另一个在另一个窗口中获取任何单元化消息的请求，则消息可能会出现在第二个窗口中，而不是在第一个窗口中。</p>\n<p>简而言之，当涉及来自同一客户端的多个同步请求时，不能保证将消息传递到创建这些请求的同一个窗口，在某些情况下，也不能保证将消息传递到所有窗口。请注意，这在大多数应用程序中通常不是问题，在 HTML5 中，这将成为不是问题，因为在 HTML5 中，每个窗口／标签都有自己的浏览上下文。</p>\n</section>\n<section id=\"settings\">\n<h2>配置<a class=\"heading-anchor\" href=\"#settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>一些 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#settings-messages\"><span class=\"std std-ref\">配置</span></a> 给你控制消息行为。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_LEVEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_LEVEL</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_STORAGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_STORAGE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a></p></li>\n</ul>\n<p>对于使用 cookie 的后端，cookie 的配置来自会话 cookie 配置：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-SESSION_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_DOMAIN</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-SESSION_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_SECURE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_HTTPONLY</span></code></a></p></li>\n</ul>\n</section>","rootId":"module-django.contrib.messages","toc":[{"title":"启用消息","anchor":"enabling-messages","children":[]},{"title":"设置消息引擎","anchor":"configuring-the-message-engine","children":[{"title":"存储后端","anchor":"storage-backends","children":[]},{"title":"消息级别","anchor":"message-levels","children":[]},{"title":"消息标签","anchor":"message-tags","children":[]}]},{"title":"在视图和模板中使用消息","anchor":"using-messages-in-views-and-templates","children":[{"title":"添加一个消息","anchor":"adding-a-message","children":[]},{"title":"显示消息","anchor":"displaying-messages","children":[]},{"title":"Message 类","anchor":"the-message-class","children":[]},{"title":"创建自定义消息级别","anchor":"creating-custom-message-levels","children":[]},{"title":"改变每次请求的最低记录级别","anchor":"changing-the-minimum-recorded-level-per-request","children":[]},{"title":"添加额外的消息标签","anchor":"adding-extra-message-tags","children":[]},{"title":"当消息框架被禁用时静默的失败了","anchor":"failing-silently-when-the-message-framework-is-disabled","children":[]},{"title":"在基于类的视图中添加消息","anchor":"adding-messages-in-class-based-views","children":[]}]},{"title":"消息过期","anchor":"expiration-of-messages","children":[]},{"title":"并行请求的行为","anchor":"behavior-of-parallel-requests","children":[]},{"title":"配置","anchor":"settings","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/4.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/humanize","title":"django.contrib.humanize","url":"/zh-hans/4.1/ref/contrib/humanize/"},"next":{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/zh-hans/4.1/ref/contrib/postgres/"},"formats":{"html":"/zh-hans/4.1/ref/contrib/messages/","markdown":"/zh-hans/4.1/ref/contrib/messages.md","json":"/zh-hans/4.1/ref/contrib/messages.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/ref/contrib/messages.txt","official":"https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/messages/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}