{"title":"The messages framework","version":"6.0","locale":"ko","docname":"ref/contrib/messages","url":"/ko/6.0/ref/contrib/messages/","canonical":"https://djangodocs.dev/ko/6.0/ref/contrib/messages/","summary":"Quite commonly in web applications, you need to display a one-time notification message (also known as “flash message”) to the user after processing a form or some…","html":"<span id=\"the-messages-framework\"></span><h1>The messages framework<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>Quite commonly in web applications, you need to display a one-time\nnotification message (also known as “flash message”) to the user after\nprocessing a form or some other types of user input.</p>\n<p>For this, Django provides full support for cookie- and session-based\nmessaging, for both anonymous and authenticated users. The messages framework\nallows you to temporarily store messages in one request and retrieve them for\ndisplay in a subsequent request (usually the next one). Every message is\ntagged with a specific <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> that determines its priority (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">info</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">warning</span></code>, or <code class=\"docutils literal notranslate\"><span class=\"pre\">error</span></code>).</p>\n<section id=\"enabling-messages\">\n<h2>Enabling messages<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>Messages are implemented through a <a class=\"reference internal\" href=\"/ko/6.0/ref/middleware/\"><span class=\"doc\">middleware</span></a>\nclass and corresponding <a class=\"reference internal\" href=\"/ko/6.0/ref/templates/api/\"><span class=\"doc\">context processor</span></a>.</p>\n<p>The default <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> created by <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code>\nalready contains all the settings required to enable message functionality:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages'</span></code> is in <a class=\"reference internal\" href=\"/ko/6.0/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=\"/ko/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> contains\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sessions.middleware.SessionMiddleware'</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages.middleware.MessageMiddleware'</span></code>.</p>\n<p>The default <a class=\"reference internal\" href=\"#message-storage-backends\"><span class=\"std std-ref\">storage backend</span></a> relies on\n<a class=\"reference internal\" href=\"/ko/6.0/topics/http/sessions/\"><span class=\"doc\">sessions</span></a>. That’s why <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code>\nmust be enabled and appear before <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageMiddleware</span></code> in\n<a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>.</p>\n</li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">'context_processors'</span></code> option of the <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> backend\ndefined in your <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> setting contains\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages.context_processors.messages'</span></code>.</p></li>\n</ul>\n<p>If you don’t want to use messages, you can remove\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.messages'</span></code> from your <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">MessageMiddleware</span></code> line from <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, and the <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code>\ncontext processor from <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>.</p>\n</section>\n<section id=\"configuring-the-message-engine\">\n<h2>Configuring the message engine<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>Storage backends<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>The messages framework can use different backends to store temporary messages.</p>\n<p>Django provides three built-in storage classes in\n<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>This class stores all messages inside of the request’s session. Therefore\nit requires Django’s <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.sessions</span></code> application.</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>This class stores the message data in a cookie (signed with a secret hash\nto prevent manipulation) to persist notifications across requests. Old\nmessages are dropped if the cookie data size would exceed 2048 bytes.</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>This class first uses <code class=\"docutils literal notranslate\"><span class=\"pre\">CookieStorage</span></code>, and falls back to using\n<code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStorage</span></code> for the messages that could not fit in a single cookie.\nIt also requires Django’s <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.sessions</span></code> application.</p>\n<p>This behavior avoids writing to the session whenever possible. It should\nprovide the best performance in the general case.</p>\n</dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.contrib.messages.storage.fallback.FallbackStorage\" title=\"django.contrib.messages.storage.fallback.FallbackStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FallbackStorage</span></code></a> is the\ndefault storage class. If it isn’t suitable to your needs, you can select\nanother storage class by setting <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MESSAGE_STORAGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_STORAGE</span></code></a> to its full import\npath, for example:</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=\"s2\">&quot;django.contrib.messages.storage.cookie.CookieStorage&quot;</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>To write your own storage class, subclass the <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseStorage</span></code> class in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.messages.storage.base</span></code> and implement the <code class=\"docutils literal notranslate\"><span class=\"pre\">_get</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">_store</span></code> methods.</p>\n</section>\n<section id=\"message-levels\">\n<span id=\"message-level\"></span><h3>Message levels<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>The messages framework is based on a configurable level architecture similar\nto that of the Python logging module. Message levels allow you to group\nmessages by type so they can be filtered or displayed differently in views and\ntemplates.</p>\n<p>The built-in levels, which can be imported from <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.messages</span></code>\ndirectly, are:</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>Constant</p></th>\n<th class=\"head\"><p>Purpose</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>Development-related messages that will be ignored (or removed) in a production deployment</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>Informational messages for the user</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>An action was successful, e.g. “Your profile was updated successfully”</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>A failure did not occur but may be imminent</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>An action was <strong>not</strong> successful or some other failure occurred</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>The <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MESSAGE_LEVEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_LEVEL</span></code></a> setting can be used to change the minimum recorded\nlevel (or it can be <a class=\"reference internal\" href=\"#changing-the-minimum-recorded-level-per-request\">changed per request</a>). Attempts to add messages of a\nlevel less than this will be ignored.</p>\n</section>\n<section id=\"message-tags\">\n<h3>Message tags<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>Message tags are a string representation of the message level plus any\nextra tags that were added directly in the view (see\n<a class=\"reference internal\" href=\"#adding-extra-message-tags\">Adding extra message tags</a> below for more details). Tags are stored in a\nstring and are separated by spaces. Typically, message tags\nare used as CSS classes to customize message style based on message type. By\ndefault, each level has a single tag that’s a lowercase version of its own\nconstant:</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>Level Constant</p></th>\n<th class=\"head\"><p>Tag</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>To change the default tags for a message level (either built-in or custom),\nset the <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> setting to a dictionary containing the levels\nyou wish to change. As this extends the default tags, you only need to provide\ntags for the levels you wish to override:</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\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=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n    <span class=\"mi\">50</span><span class=\"p\">:</span> <span class=\"s2\">&quot;critical&quot;</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>Using messages in views and templates<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>Adding a message<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>To add a message, call:</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=\"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=\"s2\">&quot;Hello world.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Some shortcut methods provide a standard way to add messages with commonly\nused tags (which are usually represented as HTML classes for the message):</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=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> SQL statements were executed.&quot;</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=\"s2\">&quot;Three credits remain in your account.&quot;</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=\"s2\">&quot;Profile details updated.&quot;</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=\"s2\">&quot;Your account expires in three days.&quot;</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=\"s2\">&quot;Document deleted.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"displaying-messages\">\n<span id=\"message-displaying\"></span><h3>Displaying messages<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>In your template</strong>, use something like:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">messages</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">ul</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;messages&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">message</span> <span class=\"k\">in</span> <span class=\"nv\">messages</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">message.tags</span> <span class=\"cp\">%}</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">message.tags</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">message</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>If you’re using the context processor, your template should be rendered with a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code>. Otherwise, ensure <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> is available to\nthe template context.</p>\n<p>Even if you know there is only one message, you should still iterate over the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> sequence, because otherwise the message storage will not be\ncleared for the next request.</p>\n<p>The context processor also provides a <code class=\"docutils literal notranslate\"><span class=\"pre\">DEFAULT_MESSAGE_LEVELS</span></code> variable which\nis a mapping of the message level names to their numeric value:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">messages</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">ul</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;messages&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">message</span> <span class=\"k\">in</span> <span class=\"nv\">messages</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">message.tags</span> <span class=\"cp\">%}</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">message.tags</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">message.level</span> <span class=\"o\">==</span> <span class=\"nv\">DEFAULT_MESSAGE_LEVELS.ERROR</span> <span class=\"cp\">%}</span>Important: <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">message</span> <span class=\"cp\">}}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><strong>Outside of templates</strong>, you can use\n<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>For instance, you can fetch all the messages to return them in a\n<a class=\"reference internal\" href=\"/ko/6.0/topics/class-based-views/mixins/#jsonresponsemixin-example\"><span class=\"std std-ref\">JSONResponseMixin</span></a> instead of a\n<a class=\"reference internal\" href=\"/ko/6.0/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><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> will return an\ninstance of the configured storage backend.</p>\n</section>\n<section id=\"the-message-class\">\n<h3>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Message</span></code> class<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.Message\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Message</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.Message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>When you loop over the list of messages in a template, what you get are\ninstances of the <code class=\"docutils literal notranslate\"><span class=\"pre\">Message</span></code> class. They have only a few attributes:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code>: The actual text of the message.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code>: An integer describing the type of the message (see the\n<a class=\"reference internal\" href=\"#message-levels\">message levels</a> section above).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>: A string combining all the message’s tags (<code class=\"docutils literal notranslate\"><span class=\"pre\">extra_tags</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">level_tag</span></code>) separated by spaces.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_tags</span></code>: A string containing custom tags for this message,\nseparated by spaces. It’s empty by default.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">level_tag</span></code>: The string representation of the level. By default, it’s\nthe lowercase version of the name of the associated constant, but this\ncan be changed if you need by using the <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> setting.</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"creating-custom-message-levels\">\n<h3>Creating custom message levels<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>Messages levels are nothing more than integers, so you can define your own\nlevel constants and use them to create more customized user feedback, e.g.:</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\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=\"s2\">&quot;A serious error occurred.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>When creating custom message levels you should be careful to avoid overloading\nexisting levels. The values for the built-in levels are:</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>Level Constant</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>If you need to identify the custom levels in your HTML or CSS, you need to\nprovide a mapping via the <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-MESSAGE_TAGS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MESSAGE_TAGS</span></code></a> setting.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>If you are creating a reusable application, it is recommended to use\nonly the built-in <a class=\"reference internal\" href=\"#message-levels\">message levels</a> and not rely on any custom levels.</p>\n</aside>\n</section>\n<section id=\"changing-the-minimum-recorded-level-per-request\">\n<h3>Changing the minimum recorded level per-request<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>The minimum recorded level can be set per request via the <code class=\"docutils literal notranslate\"><span class=\"pre\">set_level</span></code>\nmethod:</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=\"s2\">&quot;Test message...&quot;</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=\"s2\">&quot;Your profile was updated.&quot;</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=\"s2\">&quot;Your account is about to expire.&quot;</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>Similarly, the current effective level can be retrieved with <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\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>For more information on how the minimum recorded level functions, see\n<a class=\"reference internal\" href=\"#message-levels\">Message levels</a> above.</p>\n</section>\n<section id=\"adding-extra-message-tags\">\n<h3>Adding extra message tags<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>For more direct control over message tags, you can optionally provide a string\ncontaining extra tags to any of the add methods:</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=\"s2\">&quot;Over 9000!&quot;</span><span class=\"p\">,</span> <span class=\"n\">extra_tags</span><span class=\"o\">=</span><span class=\"s2\">&quot;dragonball&quot;</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=\"s2\">&quot;Email box full&quot;</span><span class=\"p\">,</span> <span class=\"n\">extra_tags</span><span class=\"o\">=</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Extra tags are added before the default tag for that level and are space\nseparated.</p>\n</section>\n<section id=\"failing-silently-when-the-message-framework-is-disabled\">\n<h3>Failing silently when the message framework is disabled<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>If you’re writing a reusable app (or other piece of code) and want to include\nmessaging functionality, but don’t want to require your users to enable it\nif they don’t want to, you may pass an additional keyword argument\n<code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently=True</span></code> to any of the <code class=\"docutils literal notranslate\"><span class=\"pre\">add_message</span></code> family of methods. For\nexample:</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>\n    <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Profile details updated.&quot;</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=\"s2\">&quot;Hello world.&quot;</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\">참고</p>\n<p>Setting <code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently=True</span></code> only hides the <code class=\"docutils literal notranslate\"><span class=\"pre\">MessageFailure</span></code> that would\notherwise occur when the messages framework disabled and one attempts to\nuse one of the <code class=\"docutils literal notranslate\"><span class=\"pre\">add_message</span></code> family of methods. It does not hide failures\nthat may occur for other reasons.</p>\n</aside>\n</section>\n<section id=\"adding-messages-in-class-based-views\">\n<h3>Adding messages in class-based views<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>Adds a success message attribute to\n<a class=\"reference internal\" href=\"/ko/6.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView\" title=\"django.views.generic.edit.FormView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FormView</span></code></a> based classes</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> is the cleaned data from the form which is used for\nstring formatting</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><strong>Example 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\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=\"s2\">&quot;/success/&quot;</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>The cleaned data from the <code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code> is available for string interpolation using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">%(field_name)s</span></code> syntax. For ModelForms, if you need access to fields\nfrom the saved <code class=\"docutils literal notranslate\"><span class=\"pre\">object</span></code> override the\n<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>\nmethod.</p>\n<p><strong>Example views.py for ModelForms</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\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=\"s2\">&quot;/success/&quot;</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>Expiration of messages<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>The messages are marked to be cleared when the storage instance is iterated\n(and cleared when the response is processed).</p>\n<p>To avoid the messages being cleared, you can set the messages storage to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> after iterating:</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>Behavior of parallel requests<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>Due to the way cookies (and hence sessions) work, <strong>the behavior of any\nbackends that make use of cookies or sessions is undefined when the same\nclient makes multiple requests that set or get messages in parallel</strong>. For\nexample, if a client initiates a request that creates a message in one window\n(or tab) and then another that fetches any uniterated messages in another\nwindow, before the first window redirects, the message may appear in the\nsecond window instead of the first window where it may be expected.</p>\n<p>In short, when multiple simultaneous requests from the same client are\ninvolved, messages are not guaranteed to be delivered to the same window that\ncreated them nor, in some cases, at all. Note that this is typically not a\nproblem in most applications and will become a non-issue in HTML5, where each\nwindow/tab will have its own browsing context.</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 few <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#settings-messages\"><span class=\"std std-ref\">settings</span></a> give you control over message\nbehavior:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ko/6.0/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=\"/ko/6.0/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=\"/ko/6.0/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>For backends that use cookies, the settings for the cookie are taken from\nthe session cookie settings:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ko/6.0/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 href=\"#id1\"><span class=\"problematic\" id=\"id2\">:설정:`SESSION_COOKIE_SECURE`</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/6.0/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>\n<section id=\"testing\">\n<h2>테스트중<a class=\"heading-anchor\" href=\"#testing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>This module offers a tailored test assertion method, for testing messages\nattached to an <a class=\"reference internal\" href=\"/ko/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>.</p>\n<p>To benefit from this assertion, add <code class=\"docutils literal notranslate\"><span class=\"pre\">MessagesTestMixin</span></code> to the class\nhierarchy:</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.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MessagesTestMixin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MsgTestCase</span><span class=\"p\">(</span><span class=\"n\">MessagesTestMixin</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Then, inherit from the <code class=\"docutils literal notranslate\"><span class=\"pre\">MsgTestCase</span></code> in your tests.</p>\n<dl class=\"py method\" id=\"module-django.contrib.messages.test\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.test.MessagesTestMixin.assertMessages\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">MessagesTestMixin.</span></span><span class=\"sig-name descname\"><span class=\"pre\">assertMessages</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">response</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expected_messages</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ordered</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.messages.test.MessagesTestMixin.assertMessages\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Asserts that <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\">messages</span></code></a> added to the <a class=\"reference internal\" href=\"/ko/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">response</span></code></a> matches <code class=\"docutils literal notranslate\"><span class=\"pre\">expected_messages</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">expected_messages</span></code> is a list of\n<a class=\"reference internal\" href=\"#django.contrib.messages.Message\" title=\"django.contrib.messages.Message\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Message</span></code></a> objects.</p>\n<p>By default, the comparison is ordering dependent. You can disable this by\nsetting the <code class=\"docutils literal notranslate\"><span class=\"pre\">ordered</span></code> argument to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.messages","toc":[{"title":"Enabling messages","anchor":"enabling-messages","children":[]},{"title":"Configuring the message engine","anchor":"configuring-the-message-engine","children":[{"title":"Storage backends","anchor":"storage-backends","children":[]},{"title":"Message levels","anchor":"message-levels","children":[]},{"title":"Message tags","anchor":"message-tags","children":[]}]},{"title":"Using messages in views and templates","anchor":"using-messages-in-views-and-templates","children":[{"title":"Adding a message","anchor":"adding-a-message","children":[]},{"title":"Displaying messages","anchor":"displaying-messages","children":[]},{"title":"The Message class","anchor":"the-message-class","children":[]},{"title":"Creating custom message levels","anchor":"creating-custom-message-levels","children":[]},{"title":"Changing the minimum recorded level per-request","anchor":"changing-the-minimum-recorded-level-per-request","children":[]},{"title":"Adding extra message tags","anchor":"adding-extra-message-tags","children":[]},{"title":"Failing silently when the message framework is disabled","anchor":"failing-silently-when-the-message-framework-is-disabled","children":[]},{"title":"Adding messages in class-based views","anchor":"adding-messages-in-class-based-views","children":[]}]},{"title":"Expiration of messages","anchor":"expiration-of-messages","children":[]},{"title":"Behavior of parallel requests","anchor":"behavior-of-parallel-requests","children":[]},{"title":"설정","anchor":"settings","children":[]},{"title":"테스트중","anchor":"testing","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 레퍼런스","url":"/ko/6.0/ref/"},{"docname":"ref/contrib/index","title":"contrib packages","url":"/ko/6.0/ref/contrib/"}],"prev":{"docname":"ref/contrib/humanize","title":"django.contrib.humanize","url":"/ko/6.0/ref/contrib/humanize/"},"next":{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/ko/6.0/ref/contrib/postgres/"},"formats":{"html":"/ko/6.0/ref/contrib/messages/","markdown":"/ko/6.0/ref/contrib/messages.md","json":"/ko/6.0/ref/contrib/messages.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/ref/contrib/messages.txt","official":"https://docs.djangoproject.com/ko/6.0/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","1.11"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}