“Django/docs/3.0.x/ref/contrib/messages”的版本间差异

来自菜鸟教程
Django/docs/3.0.x/ref/contrib/messages
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:消息框架 — Django 文档}}
 
<div id="module-django.contrib.messages" class="section">
 
<div id="module-django.contrib.messages" class="section">
  
 
<span id="the-messages-framework"></span>
 
<span id="the-messages-framework"></span>
= The messages framework =
+
= 消息框架 =
  
Quite commonly in web applications, you need to display a one-time
+
在 Web 应用程序中,在处理表单或某些其他类型的用户输入后,您需要向用户显示一次性通知消息(也称为“闪现消息”),这很常见。
notification message (also known as &quot;flash message&quot;) to the user after
 
processing a form or some other types of user input.
 
  
For this, Django provides full support for cookie- and session-based
+
为此,Django 为匿名和经过身份验证的用户提供对基于 cookie 和会话的消息传递的全面支持。 消息框架允许您在一个请求中临时存储消息并检索它们以在后续请求(通常是下一个请求)中显示。 每条消息都标有确定其优先级的特定 <code>level</code>(例如,<code>info</code><code>warning</code> <code>error</code>)。
messaging, for both anonymous and authenticated users. The messages framework
 
allows you to temporarily store messages in one request and retrieve them for
 
display in a subsequent request (usually the next one). Every message is
 
tagged with a specific <code>level</code> that determines its priority (e.g., <code>info</code>,
 
<code>warning</code>, or <code>error</code>).
 
  
 
<div id="enabling-messages" class="section">
 
<div id="enabling-messages" class="section">
  
== Enabling messages ==
+
== 启用消息 ==
  
Messages are implemented through a [[../../middleware|<span class="doc">middleware</span>]]
+
消息通过 [[../../middleware|中间件]] 类和相应的 [[../../templates/api|上下文处理器]] 实现。
class and corresponding [[../../templates/api|<span class="doc">context processor</span>]].
 
  
The default <code>settings.py</code> created by <code>django-admin startproject</code>
+
<code>django-admin startproject</code> 创建的默认 <code>settings.py</code> 已经包含启用消息功能所需的所有设置:
already contains all the settings required to enable message functionality:
 
  
 
<ul>
 
<ul>
<li><p><code>'django.contrib.messages'</code> is in [[../../settings#std-setting-INSTALLED_APPS|<code>INSTALLED_APPS</code>]].</p></li>
+
<li><p><code>'django.contrib.messages'</code> [[#id1|:setting:`INSTALLED_APPS`]] 中。</p></li>
<li><p>[[../../settings#std-setting-MIDDLEWARE|<code>MIDDLEWARE</code>]] contains
+
<li><p>[[#id3|:setting:`MIDDLEWARE`]] 包含 <code>'django.contrib.sessions.middleware.SessionMiddleware'</code> <code>'django.contrib.messages.middleware.MessageMiddleware'</code></p>
<code>'django.contrib.sessions.middleware.SessionMiddleware'</code> and
+
<p>默认的 [[#message-storage-backends|存储后端]] 依赖于 [[../../../topics/http/sessions|会话]] 。 这就是为什么 <code>SessionMiddleware</code> 必须启用并出现在 [[#id5|:setting:`MIDDLEWARE`]] 中的 <code>MessageMiddleware</code> 之前。</p></li>
<code>'django.contrib.messages.middleware.MessageMiddleware'</code>.</p>
+
<li><p>[[#id7|:setting:`TEMPLATES`]] 设置中定义的 <code>DjangoTemplates</code> 后端的 <code>'context_processors'</code> 选项包含 <code>'django.contrib.messages.context_processors.messages'</code></p></li></ul>
<p>The default [[#message-storage-backends|<span class="std std-ref">storage backend</span>]] relies on
 
[[../../../topics/http/sessions|<span class="doc">sessions</span>]]. That's why <code>SessionMiddleware</code>
 
must be enabled and appear before <code>MessageMiddleware</code> in
 
[[../../settings#std-setting-MIDDLEWARE|<code>MIDDLEWARE</code>]].</p></li>
 
<li><p>The <code>'context_processors'</code> option of the <code>DjangoTemplates</code> backend
 
defined in your [[../../settings#std-setting-TEMPLATES|<code>TEMPLATES</code>]] setting contains
 
<code>'django.contrib.messages.context_processors.messages'</code>.</p></li></ul>
 
  
If you don't want to use messages, you can remove
+
如果您不想使用消息,可以从 [[#id9|:setting:`INSTALLED_APPS`]][[#id11|:setting:` 中的 <code>MessageMiddleware</code> 行中删除 <code>'django.contrib.messages'</code> MIDDLEWARE`]],以及来自 [[#id13|:setting:`TEMPLATES`]] 的 <code>messages</code> 上下文处理器。
<code>'django.contrib.messages'</code> from your [[../../settings#std-setting-INSTALLED_APPS|<code>INSTALLED_APPS</code>]], the
 
<code>MessageMiddleware</code> line from [[../../settings#std-setting-MIDDLEWARE|<code>MIDDLEWARE</code>]], and the <code>messages</code>
 
context processor from [[../../settings#std-setting-TEMPLATES|<code>TEMPLATES</code>]].
 
  
  
第47行: 第29行:
 
<div id="configuring-the-message-engine" class="section">
 
<div id="configuring-the-message-engine" class="section">
  
== Configuring the message engine ==
+
== 配置消息引擎 ==
  
 
<div id="storage-backends" class="section">
 
<div id="storage-backends" class="section">
  
 
<span id="message-storage-backends"></span>
 
<span id="message-storage-backends"></span>
=== Storage backends ===
+
=== 存储后端 ===
  
The messages framework can use different backends to store temporary messages.
+
消息框架可以使用不同的后端来存储临时消息。
  
Django provides three built-in storage classes in
+
Django [[#module-django.contrib.messages|django.contrib.messages]] 中提供了三个内置的存储类:
[[#module-django.contrib.messages|<code>django.contrib.messages</code>]]:
 
  
; ''class'' <code>storage.session.</code><code>SessionStorage</code>
+
; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">storage.session.</span></span><span class="sig-name descname"><span class="pre">SessionStorage</span></span>
: This class stores all messages inside of the request's session. Therefore it requires Django's <code>contrib.sessions</code> application.
+
: 此类存储请求会话中的所有消息。 因此它需要 Django <code>contrib.sessions</code> 应用程序。
  
; ''class'' <code>storage.cookie.</code><code>CookieStorage</code>
+
; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">storage.cookie.</span></span><span class="sig-name descname"><span class="pre">CookieStorage</span></span>
: This class stores the message data in a cookie (signed with a secret hash to prevent manipulation) to persist notifications across requests. Old messages are dropped if the cookie data size would exceed 2048 bytes.
+
: 此类将消息数据存储在 cookie 中(使用秘密哈希签名以防止操纵)以跨请求保留通知。 如果 cookie 数据大小超过 2048 字节,旧消息将被丢弃。
  
 
<dl>
 
<dl>
<dt>''class'' <code>storage.fallback.</code><code>FallbackStorage</code></dt>
+
<dt>''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">storage.fallback.</span></span><span class="sig-name descname"><span class="pre">FallbackStorage</span></span></dt>
<dd><p>This class first uses <code>CookieStorage</code>, and falls back to using
+
<dd><p>这个类首先使用 <code>CookieStorage</code>,然后回退到使用 <code>SessionStorage</code> 来处理无法放入单个 cookie 的消息。 它还需要 Django <code>contrib.sessions</code> 应用程序。</p>
<code>SessionStorage</code> for the messages that could not fit in a single cookie.
+
<p>此行为尽可能避免写入会话。 它应该在一般情况下提供最佳性能。</p></dd></dl>
It also requires Django's <code>contrib.sessions</code> application.</p>
 
<p>This behavior avoids writing to the session whenever possible. It should
 
provide the best performance in the general case.</p></dd></dl>
 
  
[[#django.contrib.messages.storage.fallback.FallbackStorage|<code>FallbackStorage</code>]] is the
+
[[#django.contrib.messages.storage.fallback.FallbackStorage|FallbackStorage]] 是默认的存储类。 如果它不适合您的需求,您可以通过将 [[#id15|:setting:`MESSAGE_STORAGE`]] 设置为其完整导入路径来选择其他存储类,例如:
default storage class. If it isn't suitable to your needs, you can select
 
another storage class by setting [[../../settings#std-setting-MESSAGE_STORAGE|<code>MESSAGE_STORAGE</code>]] to its full import
 
path, for example:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第82行: 第57行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'</pre>
+
<syntaxhighlight lang="python">MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
; ''class'' <code>storage.base.</code><code>BaseStorage</code>
+
; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">storage.base.</span></span><span class="sig-name descname"><span class="pre">BaseStorage</span></span>
 
:  
 
:  
  
To write your own storage class, subclass the <code>BaseStorage</code> class in
+
要编写自己的存储类,请在 <code>django.contrib.messages.storage.base</code> 中继承 <code>BaseStorage</code> 类并实现 <code>_get</code> <code>_store</code> 方法。
<code>django.contrib.messages.storage.base</code> and implement the <code>_get</code> and
 
<code>_store</code> methods.
 
  
  
第99行: 第72行:
  
 
<span id="message-level"></span>
 
<span id="message-level"></span>
=== Message levels ===
+
=== 消息级别 ===
  
The messages framework is based on a configurable level architecture similar
+
消息框架基于类似于 Python 日志记录模块的可配置级别架构。 消息级别允许您按类型对消息进行分组,以便它们可以在视图和模板中进行过滤或以不同方式显示。
to that of the Python logging module. Message levels allow you to group
 
messages by type so they can be filtered or displayed differently in views and
 
templates.
 
  
The built-in levels, which can be imported from <code>django.contrib.messages</code>
+
可以直接从<code>django.contrib.messages</code>中导入的内置关卡有:
directly, are:
 
  
 
{|
 
{|
!width="11%"| Constant
+
!width="11%"| 常数
!width="89%"| Purpose
+
!width="89%"| 目的
 
|-
 
|-
 
| <code>DEBUG</code>
 
| <code>DEBUG</code>
| Development-related messages that will be ignored (or removed) in a production deployment
+
| 在生产部署中将被忽略(或删除)的与开发相关的消息
 
|-
 
|-
 
| <code>INFO</code>
 
| <code>INFO</code>
| Informational messages for the user
+
| 给用户的信息性消息
 
|-
 
|-
 
| <code>SUCCESS</code>
 
| <code>SUCCESS</code>
| An action was successful, e.g. &quot;Your profile was updated successfully&quot;
+
| 一个动作成功,例如 “您的个人资料已成功更新”
 
|-
 
|-
 
| <code>WARNING</code>
 
| <code>WARNING</code>
| A failure did not occur but may be imminent
+
| 故障没有发生,但可能即将发生
 
|-
 
|-
 
| <code>ERROR</code>
 
| <code>ERROR</code>
| An action was '''not''' successful or some other failure occurred
+
| 操作 '''''' 成功或发生其他一些失败
 
|}
 
|}
  
The [[../../settings#std-setting-MESSAGE_LEVEL|<code>MESSAGE_LEVEL</code>]] setting can be used to change the minimum recorded level
+
[[#id17|:setting:`MESSAGE_LEVEL`]] 设置可用于更改最小记录级别(或者可以根据请求 [[#changing-the-minimum-recorded-level-per-request|更改]] )。 尝试添加低于此级别的消息将被忽略。
(or it can be [[#changing-the-minimum-recorded-level-per-request|changed per request]]). Attempts to add messages of a level less
 
than this will be ignored.
 
  
  
第137行: 第104行:
 
<div id="message-tags" class="section">
 
<div id="message-tags" class="section">
  
=== Message tags ===
+
=== 消息标签 ===
  
Message tags are a string representation of the message level plus any
+
消息标签是消息级别的字符串表示以及直接添加到视图中的任何额外标签(有关更多详细信息,请参阅下面的 [[#adding-extra-message-tags|添加额外的消息标签]] )。 标签存储在一个字符串中,并用空格分隔。 通常,消息标签用作 CSS 类来根据消息类型自定义消息样式。 默认情况下,每个级别都有一个标记,它是其自身常量的小写版本:
extra tags that were added directly in the view (see
 
[[#adding-extra-message-tags|Adding extra message tags]] below for more details). Tags are stored in a
 
string and are separated by spaces. Typically, message tags
 
are used as CSS classes to customize message style based on message type. By
 
default, each level has a single tag that's a lowercase version of its own
 
constant:
 
  
 
{|
 
{|
!width="56%"| Level Constant
+
!width="56%"| 电平常数
!width="44%"| Tag
+
!width="44%"| 标签
 
|-
 
|-
 
| <code>DEBUG</code>
 
| <code>DEBUG</code>
第167行: 第128行:
 
|}
 
|}
  
To change the default tags for a message level (either built-in or custom),
+
要更改消息级别的默认标签(内置或自定义),请将 [[#id19|:setting:`MESSAGE_TAGS`]] 设置设置为包含您希望更改的级别的字典。 由于这扩展了默认标签,您只需为要覆盖的级别提供标签:
set the [[../../settings#std-setting-MESSAGE_TAGS|<code>MESSAGE_TAGS</code>]] setting to a dictionary containing the levels
 
you wish to change. As this extends the default tags, you only need to provide
 
tags for the levels you wish to override:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第176行: 第134行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib.messages import constants as messages
+
<syntaxhighlight lang="python">from django.contrib.messages import constants as messages
 
MESSAGE_TAGS = {
 
MESSAGE_TAGS = {
 
     messages.INFO: '',
 
     messages.INFO: '',
 
     50: 'critical',
 
     50: 'critical',
}</pre>
+
}</syntaxhighlight>
  
 
</div>
 
</div>
第191行: 第149行:
 
<div id="using-messages-in-views-and-templates" class="section">
 
<div id="using-messages-in-views-and-templates" class="section">
  
== Using messages in views and templates ==
+
== 在视图和模板中使用消息 ==
  
; <code>add_message</code><span class="sig-paren">(</span>''<span class="n">request</span>'', ''<span class="n">level</span>'', ''<span class="n">message</span>'', ''<span class="n">extra_tags</span><span class="o">=</span><span class="default_value">''</span>'', ''<span class="n">fail_silently</span><span class="o">=</span><span class="default_value">False</span>''<span class="sig-paren">)</span>[[../../_modules/django/contrib/messages/api.html#add_message|<span class="viewcode-link">[源代码]</span>]]
+
; <span class="sig-name descname"><span class="pre">add_message</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">request</span></span>'', ''<span class="n"><span class="pre">level</span></span>'', ''<span class="n"><span class="pre">message</span></span>'', ''<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>'', ''<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>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div id="adding-a-message" class="section">
 
<div id="adding-a-message" class="section">
  
=== Adding a message ===
+
=== 添加留言 ===
  
To add a message, call:
+
要添加消息,请致电:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第206行: 第164行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib import messages
+
<syntaxhighlight lang="python">from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')</pre>
+
messages.add_message(request, messages.INFO, 'Hello world.')</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
Some shortcut methods provide a standard way to add messages with commonly
+
一些快捷方法提供了一种标准方式来添加带有常用标签的消息(通常表示为消息的 HTML 类):
used tags (which are usually represented as HTML classes for the message):
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第219行: 第176行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>messages.debug(request, '%s SQL statements were executed.' % count)
+
<syntaxhighlight lang="python">messages.debug(request, '%s SQL statements were executed.' % count)
 
messages.info(request, 'Three credits remain in your account.')
 
messages.info(request, 'Three credits remain in your account.')
 
messages.success(request, 'Profile details updated.')
 
messages.success(request, 'Profile details updated.')
 
messages.warning(request, 'Your account expires in three days.')
 
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')</pre>
+
messages.error(request, 'Document deleted.')</syntaxhighlight>
  
 
</div>
 
</div>
第233行: 第190行:
  
 
<span id="message-displaying"></span>
 
<span id="message-displaying"></span>
=== Displaying messages ===
+
=== 显示消息 ===
  
; <code>get_messages</code><span class="sig-paren">(</span>''<span class="n">request</span>''<span class="sig-paren">)</span>[[../../_modules/django/contrib/messages/api.html#get_messages|<span class="viewcode-link">[源代码]</span>]]
+
; <span class="sig-name descname"><span class="pre">get_messages</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">request</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
'''In your template''', use something like:
+
'''在你的模板'''中,使用类似的东西:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第244行: 第201行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>{% if messages %}
+
<syntaxhighlight lang="python">{% if messages %}
&lt;ul class=&quot;messages&quot;&gt;
+
<ul class="messages">
 
     {% for message in messages %}
 
     {% for message in messages %}
     &lt;li{% if message.tags %} class=&quot;{{ message.tags }}&quot;{% endif %}&gt;{{ message }}&lt;/li&gt;
+
     <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
 
     {% endfor %}
 
     {% endfor %}
&lt;/ul&gt;
+
</ul>
{% endif %}</pre>
+
{% endif %}</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
If you're using the context processor, your template should be rendered with a
+
如果您使用上下文处理器,则您的模板应使用 <code>RequestContext</code> 呈现。 否则,请确保 <code>messages</code> 可用于模板上下文。
<code>RequestContext</code>. Otherwise, ensure <code>messages</code> is available to
 
the template context.
 
  
Even if you know there is only one message, you should still iterate over the
+
即使您知道只有一条消息,您仍然应该遍历 <code>messages</code> 序列,否则消息存储将不会为下一个请求清除。
<code>messages</code> sequence, because otherwise the message storage will not be
 
cleared for the next request.
 
  
The context processor also provides a <code>DEFAULT_MESSAGE_LEVELS</code> variable which
+
上下文处理器还提供了一个 <code>DEFAULT_MESSAGE_LEVELS</code> 变量,它是消息级别名称到其数值的映射:
is a mapping of the message level names to their numeric value:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第270行: 第222行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>{% if messages %}
+
<syntaxhighlight lang="python">{% if messages %}
&lt;ul class=&quot;messages&quot;&gt;
+
<ul class="messages">
 
     {% for message in messages %}
 
     {% for message in messages %}
     &lt;li{% if message.tags %} class=&quot;{{ message.tags }}&quot;{% endif %}&gt;
+
     <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
 
         {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
 
         {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
 
         {{ message }}
 
         {{ message }}
     &lt;/li&gt;
+
     </li>
 
     {% endfor %}
 
     {% endfor %}
&lt;/ul&gt;
+
</ul>
{% endif %}</pre>
+
{% endif %}</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
'''Outside of templates''', you can use
+
'''在模板'''之外,你可以使用[[#django.contrib.messages.get_messages|get_messages()]]
[[#django.contrib.messages.get_messages|<code>get_messages()</code>]]:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第291行: 第242行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib.messages import get_messages
+
<syntaxhighlight lang="python">from django.contrib.messages import get_messages
  
 
storage = get_messages(request)
 
storage = get_messages(request)
 
for message in storage:
 
for message in storage:
     do_something_with_the_message(message)</pre>
+
     do_something_with_the_message(message)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
For instance, you can fetch all the messages to return them in a
+
例如,您可以获取所有消息以在 [[../../../topics/class-based-views/mixins#jsonresponsemixin-example|JSONResponseMixin]] 而不是 [[../../class-based-views/mixins-simple#django.views.generic.base|TemplateResponseMixin]] 中返回它们。
[[../../../topics/class-based-views/mixins#jsonresponsemixin-example|<span class="std std-ref">JSONResponseMixin</span>]] instead of a
 
[[../../class-based-views/mixins-simple#django.views.generic.base|<code>TemplateResponseMixin</code>]].
 
  
[[#django.contrib.messages.get_messages|<code>get_messages()</code>]] will return an
+
[[#django.contrib.messages.get_messages|get_messages()]] 将返回配置的存储后端的实例。
instance of the configured storage backend.
 
  
  
第311行: 第259行:
 
<div id="the-message-class" class="section">
 
<div id="the-message-class" class="section">
  
=== The <code>Message</code> class ===
+
=== Message ===
  
; ''class'' <code>storage.base.</code><code>Message</code>
+
; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">storage.base.</span></span><span class="sig-name descname"><span class="pre">Message</span></span>
: When you loop over the list of messages in a template, what you get are instances of the <code>Message</code> class. They have only a few attributes:
+
: 当您遍历模板中的消息列表时,您得到的是 <code>Message</code> 类的实例。 它们只有几个属性:
;* <code>message</code>: The actual text of the message.
+
;* <code>message</code>:消息的实际文本。
;* <code>level</code>: An integer describing the type of the message (see the [[#message-levels|message levels]] section above).
+
;* <code>level</code>:描述消息类型的整数(请参阅上面的 [[#message-levels|消息级别]] 部分)。
;* <code>tags</code>: A string combining all the message's tags (<code>extra_tags</code> and <code>level_tag</code>) separated by spaces.
+
;* <code>tags</code>:由空格分隔的所有消息标签(<code>extra_tags</code> <code>level_tag</code>)组合而成的字符串。
;* <code>extra_tags</code>: A string containing custom tags for this message, separated by spaces. It's empty by default.
+
;* <code>extra_tags</code>:包含此消息的自定义标签的字符串,以空格分隔。 默认为空。
;* <code>level_tag</code>: The string representation of the level. By default, it's the lowercase version of the name of the associated constant, but this can be changed if you need by using the [[../../settings#std-setting-MESSAGE_TAGS|<code>MESSAGE_TAGS</code>]] setting.
+
;* <code>level_tag</code>:级别的字符串表示。 默认情况下,它是关联常量名称的小写版本,但如果需要,可以使用 [[#id21|:setting:`MESSAGE_TAGS`]] 设置进行更改。
  
  
第325行: 第273行:
 
<div id="creating-custom-message-levels" class="section">
 
<div id="creating-custom-message-levels" class="section">
  
=== Creating custom message levels ===
+
=== 创建自定义消息级别 ===
  
Messages levels are nothing more than integers, so you can define your own
+
消息级别只不过是整数,因此您可以定义自己的级别常量并使用它们来创建更多定制的用户反馈,例如:
level constants and use them to create more customized user feedback, e.g.:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第334行: 第281行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>CRITICAL = 50
+
<syntaxhighlight lang="python">CRITICAL = 50
  
 
def my_view(request):
 
def my_view(request):
     messages.add_message(request, CRITICAL, 'A serious error occurred.')</pre>
+
     messages.add_message(request, CRITICAL, 'A serious error occurred.')</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
When creating custom message levels you should be careful to avoid overloading
+
创建自定义消息级别时,您应该小心避免使现有级别过载。 内置级别的值是:
existing levels. The values for the built-in levels are:
 
  
 
{|
 
{|
!width="74%"| Level Constant
+
!width="74%"| 电平常数
!width="26%"| Value
+
!width="26%"| 价值
 
|-
 
|-
 
| <code>DEBUG</code>
 
| <code>DEBUG</code>
第365行: 第311行:
 
|}
 
|}
  
If you need to identify the custom levels in your HTML or CSS, you need to
+
如果您需要在 HTML CSS 中识别自定义级别,则需要通过 [[#id23|:setting:`MESSAGE_TAGS`]] 设置提供映射。
provide a mapping via the [[../../settings#std-setting-MESSAGE_TAGS|<code>MESSAGE_TAGS</code>]] setting.
 
  
 
<div class="admonition note">
 
<div class="admonition note">
  
注解
+
笔记
  
If you are creating a reusable application, it is recommended to use
+
如果您正在创建可重用的应用程序,建议仅使用内置的 [[#message-levels|消息级别]] ,不要依赖任何自定义级别。
only the built-in [[#message-levels|message levels]] and not rely on any custom levels.
 
  
  
第381行: 第325行:
 
<div id="changing-the-minimum-recorded-level-per-request" class="section">
 
<div id="changing-the-minimum-recorded-level-per-request" class="section">
  
=== Changing the minimum recorded level per-request ===
+
=== 更改每个请求的最低记录级别 ===
  
The minimum recorded level can be set per request via the <code>set_level</code>
+
可以通过 <code>set_level</code> 方法为每个请求设置最低记录级别:
method:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第390行: 第333行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib import messages
+
<syntaxhighlight lang="python">from django.contrib import messages
  
 
# Change the messages level to ensure the debug message is added.
 
# Change the messages level to ensure the debug message is added.
第402行: 第345行:
  
 
# Set the messages level back to default.
 
# Set the messages level back to default.
messages.set_level(request, None)</pre>
+
messages.set_level(request, None)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
Similarly, the current effective level can be retrieved with <code>get_level</code>:
+
类似地,可以通过 <code>get_level</code> 检索当前有效级别:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第413行: 第356行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib import messages
+
<syntaxhighlight lang="python">from django.contrib import messages
current_level = messages.get_level(request)</pre>
+
current_level = messages.get_level(request)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
For more information on how the minimum recorded level functions, see
+
有关最低记录级别如何运作的更多信息,请参阅上面的 [[#message-levels|消息级别]]
[[#message-levels|Message levels]] above.
 
  
  
第426行: 第368行:
 
<div id="adding-extra-message-tags" class="section">
 
<div id="adding-extra-message-tags" class="section">
  
=== Adding extra message tags ===
+
=== 添加额外的消息标签 ===
  
For more direct control over message tags, you can optionally provide a string
+
为了更直接地控制消息标签,您可以选择向任何添加方法提供一个包含额外标签的字符串:
containing extra tags to any of the add methods:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第435行: 第376行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
+
<syntaxhighlight lang="python">messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
messages.error(request, 'Email box full', extra_tags='email')</pre>
+
messages.error(request, 'Email box full', extra_tags='email')</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
Extra tags are added before the default tag for that level and are space
+
在该级别的默认标签之前添加额外的标签,并以空格分隔。
separated.
 
  
  
第448行: 第388行:
 
<div id="failing-silently-when-the-message-framework-is-disabled" class="section">
 
<div id="failing-silently-when-the-message-framework-is-disabled" class="section">
  
=== Failing silently when the message framework is disabled ===
+
=== 禁用消息框架时静默失败 ===
  
If you're writing a reusable app (or other piece of code) and want to include
+
如果您正在编写一个可重用的应用程序(或其他代码段)并希望包含消息传递功能,但又不想要求您的用户启用它(如果他们不想启用它),您可以传递一个额外的关键字参数 [ X220X] 到 <code>add_message</code> 方法系列中的任何一个。 例如:
messaging functionality, but don't want to require your users to enable it
 
if they don't want to, you may pass an additional keyword argument
 
<code>fail_silently=True</code> to any of the <code>add_message</code> family of methods. For
 
example:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第460行: 第396行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>messages.add_message(
+
<syntaxhighlight lang="python">messages.add_message(
 
     request, messages.SUCCESS, 'Profile details updated.',
 
     request, messages.SUCCESS, 'Profile details updated.',
 
     fail_silently=True,
 
     fail_silently=True,
 
)
 
)
messages.info(request, 'Hello world.', fail_silently=True)</pre>
+
messages.info(request, 'Hello world.', fail_silently=True)</syntaxhighlight>
  
 
</div>
 
</div>
第471行: 第407行:
 
<div class="admonition note">
 
<div class="admonition note">
  
注解
+
笔记
  
Setting <code>fail_silently=True</code> only hides the <code>MessageFailure</code> that would
+
设置 <code>fail_silently=True</code> 只会隐藏 <code>MessageFailure</code>,否则会在消息框架禁用并尝试使用 <code>add_message</code> 系列方法之一时发生。 它不会隐藏由于其他原因可能发生的故障。
otherwise occur when the messages framework disabled and one attempts to
 
use one of the <code>add_message</code> family of methods. It does not hide failures
 
that may occur for other reasons.
 
  
  
第484行: 第417行:
 
<div id="adding-messages-in-class-based-views" class="section">
 
<div id="adding-messages-in-class-based-views" class="section">
  
=== Adding messages in class-based views ===
+
=== 在基于类的视图中添加消息 ===
  
; ''class'' <code>views.</code><code>SuccessMessageMixin</code>
+
; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">views.</span></span><span class="sig-name descname"><span class="pre">SuccessMessageMixin</span></span>
: Adds a success message attribute to [[../../class-based-views/generic-editing#django.views.generic.edit|<code>FormView</code>]] based classes
+
: 向基于 [[../../class-based-views/generic-editing#django.views.generic.edit|FormView]] 的类添加成功消息属性
;; <code>get_success_message</code><span class="sig-paren">(</span>''<span class="n">cleaned_data</span>''<span class="sig-paren">)</span>
+
;; <span class="sig-name descname"><span class="pre">get_success_message</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">cleaned_data</span></span>''<span class="sig-paren">)</span>
;: <code>cleaned_data</code> is the cleaned data from the form which is used for string formatting
+
;: <code>cleaned_data</code> 是用于字符串格式化的表单中的清理数据
  
'''示例 views.py''':
+
'''示例views.py'''
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第497行: 第430行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib.messages.views import SuccessMessageMixin
+
<syntaxhighlight lang="python">from django.contrib.messages.views import SuccessMessageMixin
 
from django.views.generic.edit import CreateView
 
from django.views.generic.edit import CreateView
 
from myapp.models import Author
 
from myapp.models import Author
第504行: 第437行:
 
     model = Author
 
     model = Author
 
     success_url = '/success/'
 
     success_url = '/success/'
     success_message = &quot;%(name)s was created successfully&quot;</pre>
+
     success_message = "%(name)s was created successfully"</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
The cleaned data from the <code>form</code> is available for string interpolation using
+
来自 <code>form</code> 的清理数据可用于使用 <code>%(field_name)s</code> 语法的字符串插值。 对于 ModelForms,如果您需要从保存的 <code>object</code> 访问字段,请覆盖 [[#django.contrib.messages.views.SuccessMessageMixin.get_success_message|get_success_message()]] 方法。
the <code>%(field_name)s</code> syntax. For ModelForms, if you need access to fields
 
from the saved <code>object</code> override the
 
[[#django.contrib.messages.views.SuccessMessageMixin.get_success_message|<code>get_success_message()</code>]]
 
method.
 
  
'''Example views.py for ModelForms''':
+
'''ModelForms'''的示例views.py:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第521行: 第450行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib.messages.views import SuccessMessageMixin
+
<syntaxhighlight lang="python">from django.contrib.messages.views import SuccessMessageMixin
 
from django.views.generic.edit import CreateView
 
from django.views.generic.edit import CreateView
 
from myapp.models import ComplicatedModel
 
from myapp.models import ComplicatedModel
第528行: 第457行:
 
     model = ComplicatedModel
 
     model = ComplicatedModel
 
     success_url = '/success/'
 
     success_url = '/success/'
     success_message = &quot;%(calculated_field)s was created successfully&quot;
+
     success_message = "%(calculated_field)s was created successfully"
  
 
     def get_success_message(self, cleaned_data):
 
     def get_success_message(self, cleaned_data):
第534行: 第463行:
 
             cleaned_data,
 
             cleaned_data,
 
             calculated_field=self.object.calculated_field,
 
             calculated_field=self.object.calculated_field,
         )</pre>
+
         )</syntaxhighlight>
  
 
</div>
 
</div>
第545行: 第474行:
 
<div id="expiration-of-messages" class="section">
 
<div id="expiration-of-messages" class="section">
  
== Expiration of messages ==
+
== 消息过期 ==
  
The messages are marked to be cleared when the storage instance is iterated
+
消息被标记为在迭代存储实例时清除(并在处理响应时清除)。
(and cleared when the response is processed).
 
  
To avoid the messages being cleared, you can set the messages storage to
+
为避免消息被清除,您可以在迭代后将消息存储设置为<code>False</code>
<code>False</code> after iterating:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第557行: 第484行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>storage = messages.get_messages(request)
+
<syntaxhighlight lang="python">storage = messages.get_messages(request)
 
for message in storage:
 
for message in storage:
 
     do_something_with(message)
 
     do_something_with(message)
storage.used = False</pre>
+
storage.used = False</syntaxhighlight>
  
 
</div>
 
</div>
第569行: 第496行:
 
<div id="behavior-of-parallel-requests" class="section">
 
<div id="behavior-of-parallel-requests" class="section">
  
== Behavior of parallel requests ==
+
== 并行请求的行为 ==
  
Due to the way cookies (and hence sessions) work, '''the behavior of any
+
由于 cookie(以及会话)的工作方式,'''当同一个客户端发出多个并行设置或获取消息的请求时,任何使用 cookie 或会话的后端的行为都是未定义的'''。 例如,如果客户端发起一个请求,在一个窗口(或选项卡)中创建一条消息,然后另一个在另一个窗口中获取任何统一消息,则在第一个窗口重定向之前,该消息可能会出现在第二个窗口而不是第一个窗口中可能会出现的窗口。
backends that make use of cookies or sessions is undefined when the same
 
client makes multiple requests that set or get messages in parallel'''. For
 
example, if a client initiates a request that creates a message in one window
 
(or tab) and then another that fetches any uniterated messages in another
 
window, before the first window redirects, the message may appear in the
 
second window instead of the first window where it may be expected.
 
  
In short, when multiple simultaneous requests from the same client are
+
简而言之,当涉及来自同一个客户端的多个同时请求时,不能保证消息被传送到创建它们的同一个窗口,在某些情况下,甚至根本不能保证。 请注意,这在大多数应用程序中通常不是问题,并且在 HTML5 中将成为非问题,其中每个窗口/选项卡都有自己的浏览上下文。
involved, messages are not guaranteed to be delivered to the same window that
 
created them nor, in some cases, at all. Note that this is typically not a
 
problem in most applications and will become a non-issue in HTML5, where each
 
window/tab will have its own browsing context.
 
  
  
第589行: 第506行:
 
<div id="settings" class="section">
 
<div id="settings" class="section">
  
== 配置 ==
+
== 设置 ==
  
A few [[../../settings#settings-messages|<span class="std std-ref">settings</span>]] give you control over message
+
一些 [[../../settings#settings-messages|设置]] 可让您控制消息行为:
behavior:
 
  
* [[../../settings#std-setting-MESSAGE_LEVEL|<code>MESSAGE_LEVEL</code>]]
+
* [[#id25|<span id="id26" class="problematic">:设置:`MESSAGE_LEVEL`</span>]]
* [[../../settings#std-setting-MESSAGE_STORAGE|<code>MESSAGE_STORAGE</code>]]
+
* [[#id27|<span id="id28" class="problematic">:设置:`MESSAGE_STORAGE`</span>]]
* [[../../settings#std-setting-MESSAGE_TAGS|<code>MESSAGE_TAGS</code>]]
+
* [[#id29|<span id="id30" class="problematic">:设置:`MESSAGE_TAGS`</span>]]
  
For backends that use cookies, the settings for the cookie are taken from
+
对于使用 cookie 的后端,cookie 的设置取自会话 cookie 设置:
the session cookie settings:
 
  
* [[../../settings#std-setting-SESSION_COOKIE_DOMAIN|<code>SESSION_COOKIE_DOMAIN</code>]]
+
* [[#id31|<span id="id32" class="problematic">:设置:`SESSION_COOKIE_DOMAIN`</span>]]
* [[../../settings#std-setting-SESSION_COOKIE_SECURE|<code>SESSION_COOKIE_SECURE</code>]]
+
* [[#id33|<span id="id34" class="problematic">:设置:`SESSION_COOKIE_SECURE`</span>]]
* [[../../settings#std-setting-SESSION_COOKIE_HTTPONLY|<code>SESSION_COOKIE_HTTPONLY</code>]]
+
* [[#id35|<span id="id36" class="problematic">:设置:`SESSION_COOKIE_HTTPONLY`</span>]]
  
  
第609行: 第524行:
  
 
</div>
 
</div>
 +
<div class="clearer">
  
[[Category:Django 3.0.x 中文文档]]
+
 
 +
 
 +
</div>
 +
 
 +
[[Category:Django 3.0.x 文档]]

2021年10月31日 (日) 04:09的最新版本

消息框架

在 Web 应用程序中,在处理表单或某些其他类型的用户输入后,您需要向用户显示一次性通知消息(也称为“闪现消息”),这很常见。

为此,Django 为匿名和经过身份验证的用户提供对基于 cookie 和会话的消息传递的全面支持。 消息框架允许您在一个请求中临时存储消息并检索它们以在后续请求(通常是下一个请求)中显示。 每条消息都标有确定其优先级的特定 level(例如,infowarningerror)。

启用消息

消息通过 中间件 类和相应的 上下文处理器 实现。

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

  • 'django.contrib.messages':setting:`INSTALLED_APPS` 中。

  • :setting:`MIDDLEWARE` 包含 'django.contrib.sessions.middleware.SessionMiddleware''django.contrib.messages.middleware.MessageMiddleware'

    默认的 存储后端 依赖于 会话 。 这就是为什么 SessionMiddleware 必须启用并出现在 :setting:`MIDDLEWARE` 中的 MessageMiddleware 之前。

  • :setting:`TEMPLATES` 设置中定义的 DjangoTemplates 后端的 'context_processors' 选项包含 'django.contrib.messages.context_processors.messages'

如果您不想使用消息,可以从 :setting:`INSTALLED_APPS`:setting:` 中的 MessageMiddleware 行中删除 'django.contrib.messages' MIDDLEWARE`,以及来自 :setting:`TEMPLATES`messages 上下文处理器。


配置消息引擎

存储后端

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

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

class storage.session.SessionStorage
此类存储请求会话中的所有消息。 因此它需要 Django 的 contrib.sessions 应用程序。
class storage.cookie.CookieStorage
此类将消息数据存储在 cookie 中(使用秘密哈希签名以防止操纵)以跨请求保留通知。 如果 cookie 数据大小超过 2048 字节,旧消息将被丢弃。
class storage.fallback.FallbackStorage

这个类首先使用 CookieStorage,然后回退到使用 SessionStorage 来处理无法放入单个 cookie 的消息。 它还需要 Django 的 contrib.sessions 应用程序。

此行为尽可能避免写入会话。 它应该在一般情况下提供最佳性能。

FallbackStorage 是默认的存储类。 如果它不适合您的需求,您可以通过将 :setting:`MESSAGE_STORAGE` 设置为其完整导入路径来选择其他存储类,例如:

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
class storage.base.BaseStorage

要编写自己的存储类,请在 django.contrib.messages.storage.base 中继承 BaseStorage 类并实现 _get_store 方法。


消息级别

消息框架基于类似于 Python 日志记录模块的可配置级别架构。 消息级别允许您按类型对消息进行分组,以便它们可以在视图和模板中进行过滤或以不同方式显示。

可以直接从django.contrib.messages中导入的内置关卡有:

常数 目的
DEBUG 在生产部署中将被忽略(或删除)的与开发相关的消息
INFO 给用户的信息性消息
SUCCESS 一个动作成功,例如 “您的个人资料已成功更新”
WARNING 故障没有发生,但可能即将发生
ERROR 操作 成功或发生其他一些失败

:setting:`MESSAGE_LEVEL` 设置可用于更改最小记录级别(或者可以根据请求 更改 )。 尝试添加低于此级别的消息将被忽略。


消息标签

消息标签是消息级别的字符串表示以及直接添加到视图中的任何额外标签(有关更多详细信息,请参阅下面的 添加额外的消息标签 )。 标签存储在一个字符串中,并用空格分隔。 通常,消息标签用作 CSS 类来根据消息类型自定义消息样式。 默认情况下,每个级别都有一个标记,它是其自身常量的小写版本:

电平常数 标签
DEBUG debug
INFO info
SUCCESS success
WARNING warning
ERROR error

要更改消息级别的默认标签(内置或自定义),请将 :setting:`MESSAGE_TAGS` 设置设置为包含您希望更改的级别的字典。 由于这扩展了默认标签,您只需为要覆盖的级别提供标签:

from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
    messages.INFO: '',
    50: 'critical',
}

在视图和模板中使用消息

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

添加留言

要添加消息,请致电:

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

一些快捷方法提供了一种标准方式来添加带有常用标签的消息(通常表示为消息的 HTML 类):

messages.debug(request, '%s SQL statements were executed.' % count)
messages.info(request, 'Three credits remain in your account.')
messages.success(request, 'Profile details updated.')
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')

显示消息

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 %}

如果您使用上下文处理器,则您的模板应使用 RequestContext 呈现。 否则,请确保 messages 可用于模板上下文。

即使您知道只有一条消息,您仍然应该遍历 messages 序列,否则消息存储将不会为下一个请求清除。

上下文处理器还提供了一个 DEFAULT_MESSAGE_LEVELS 变量,它是消息级别名称到其数值的映射:

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

在模板之外,你可以使用get_messages()

from django.contrib.messages import get_messages

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

例如,您可以获取所有消息以在 JSONResponseMixin 而不是 TemplateResponseMixin 中返回它们。

get_messages() 将返回配置的存储后端的实例。


Message 类

class storage.base.Message
当您遍历模板中的消息列表时,您得到的是 Message 类的实例。 它们只有几个属性:
  • message:消息的实际文本。
  • level:描述消息类型的整数(请参阅上面的 消息级别 部分)。
  • tags:由空格分隔的所有消息标签(extra_tagslevel_tag)组合而成的字符串。
  • extra_tags:包含此消息的自定义标签的字符串,以空格分隔。 默认为空。
  • level_tag:级别的字符串表示。 默认情况下,它是关联常量名称的小写版本,但如果需要,可以使用 :setting:`MESSAGE_TAGS` 设置进行更改。


创建自定义消息级别

消息级别只不过是整数,因此您可以定义自己的级别常量并使用它们来创建更多定制的用户反馈,例如:

CRITICAL = 50

def my_view(request):
    messages.add_message(request, CRITICAL, 'A serious error occurred.')

创建自定义消息级别时,您应该小心避免使现有级别过载。 内置级别的值是:

电平常数 价值
DEBUG 10
INFO 20
SUCCESS 25
WARNING 30
ERROR 40

如果您需要在 HTML 或 CSS 中识别自定义级别,则需要通过 :setting:`MESSAGE_TAGS` 设置提供映射。

笔记

如果您正在创建可重用的应用程序,建议仅使用内置的 消息级别 ,不要依赖任何自定义级别。


更改每个请求的最低记录级别

可以通过 set_level 方法为每个请求设置最低记录级别:

from django.contrib import messages

# Change the messages level to ensure the debug message is added.
messages.set_level(request, messages.DEBUG)
messages.debug(request, 'Test message...')

# In another request, record only messages with a level of WARNING and higher
messages.set_level(request, messages.WARNING)
messages.success(request, 'Your profile was updated.') # ignored
messages.warning(request, 'Your account is about to expire.') # recorded

# Set the messages level back to default.
messages.set_level(request, None)

类似地,可以通过 get_level 检索当前有效级别:

from django.contrib import messages
current_level = messages.get_level(request)

有关最低记录级别如何运作的更多信息,请参阅上面的 消息级别


添加额外的消息标签

为了更直接地控制消息标签,您可以选择向任何添加方法提供一个包含额外标签的字符串:

messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
messages.error(request, 'Email box full', extra_tags='email')

在该级别的默认标签之前添加额外的标签,并以空格分隔。


禁用消息框架时静默失败

如果您正在编写一个可重用的应用程序(或其他代码段)并希望包含消息传递功能,但又不想要求您的用户启用它(如果他们不想启用它),您可以传递一个额外的关键字参数 [ X220X] 到 add_message 方法系列中的任何一个。 例如:

messages.add_message(
    request, messages.SUCCESS, 'Profile details updated.',
    fail_silently=True,
)
messages.info(request, 'Hello world.', fail_silently=True)

笔记

设置 fail_silently=True 只会隐藏 MessageFailure,否则会在消息框架禁用并尝试使用 add_message 系列方法之一时发生。 它不会隐藏由于其他原因可能发生的故障。


在基于类的视图中添加消息

class views.SuccessMessageMixin
向基于 FormView 的类添加成功消息属性
get_success_message(cleaned_data)
cleaned_data 是用于字符串格式化的表单中的清理数据

示例views.py

from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import Author

class AuthorCreate(SuccessMessageMixin, CreateView):
    model = Author
    success_url = '/success/'
    success_message = "%(name)s was created successfully"

来自 form 的清理数据可用于使用 %(field_name)s 语法的字符串插值。 对于 ModelForms,如果您需要从保存的 object 访问字段,请覆盖 get_success_message() 方法。

ModelForms的示例views.py:

from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import ComplicatedModel

class ComplicatedCreate(SuccessMessageMixin, CreateView):
    model = ComplicatedModel
    success_url = '/success/'
    success_message = "%(calculated_field)s was created successfully"

    def get_success_message(self, cleaned_data):
        return self.success_message % dict(
            cleaned_data,
            calculated_field=self.object.calculated_field,
        )

消息过期

消息被标记为在迭代存储实例时清除(并在处理响应时清除)。

为避免消息被清除,您可以在迭代后将消息存储设置为False

storage = messages.get_messages(request)
for message in storage:
    do_something_with(message)
storage.used = False

并行请求的行为

由于 cookie(以及会话)的工作方式,当同一个客户端发出多个并行设置或获取消息的请求时,任何使用 cookie 或会话的后端的行为都是未定义的。 例如,如果客户端发起一个请求,在一个窗口(或选项卡)中创建一条消息,然后另一个在另一个窗口中获取任何统一消息,则在第一个窗口重定向之前,该消息可能会出现在第二个窗口而不是第一个窗口中可能会出现的窗口。

简而言之,当涉及来自同一个客户端的多个同时请求时,不能保证消息被传送到创建它们的同一个窗口,在某些情况下,甚至根本不能保证。 请注意,这在大多数应用程序中通常不是问题,并且在 HTML5 中将成为非问题,其中每个窗口/选项卡都有自己的浏览上下文。


设置

一些 设置 可让您控制消息行为:

对于使用 cookie 的后端,cookie 的设置取自会话 cookie 设置: