{"title":"独自のテンプレートタグとフィルタを作る","version":"6.1","locale":"ja","docname":"howto/custom-template-tags","url":"/ja/6.1/howto/custom-template-tags/","canonical":"https://djangodocs.dev/ja/6.1/howto/custom-template-tags/","summary":"Django のテンプレート言語は、アプリケーションのプレゼンテーションロジックのニーズに対応するように設計された、多種多様な埋め込みタグやフィルタを搭載しています…","html":"<h1>独自のテンプレートタグとフィルタを作る<a class=\"heading-anchor\" href=\"#how-to-create-custom-template-tags-and-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django のテンプレート言語は、アプリケーションのプレゼンテーションロジックのニーズに対応するように設計された、多種多様な <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/\"><span class=\"doc\">埋め込みタグやフィルタ</span></a> を搭載しています。それでもなお、テンプレート構成要素のコア・セットでカバーされていない機能が必要になることもあるでしょう。そのときは Python を使用し、独自のタグやフィルタを定義することによって、テンプレートエンジンを拡張できます。その上で、<a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\">{% load %}</code></a> タグを使用すると、テンプレートでそれらの機能を利用することができるようになります。</p>\n<section id=\"code-layout\">\n<h2>コードのレイアウト<a class=\"heading-anchor\" href=\"#code-layout\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>独自のテンプレートタグやフィルタを指定するための最も一般的な場所は、Django のアプリケーションの内部です。それらが既存のアプリに関連するものである場合は、この場所にバンドルするのが最適です。それ以外の場合は、新しいアプリケーションに追加されてしまいます。Django のアプリケーションが <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> に追加されると、以下に記載された従来の場所に定義したタグは、自動的にテンプレート内に読み込むことが可能になります。</p>\n<p>アプリケーションは、&quot;models.py&quot; や &quot;views.py&quot; などと同じレベルに &quot;templatetags&quot; ディレクトリを含むべきです。まだ存在していない場合は、ディレクトリが Python パッケージとして扱われるようにするため、&quot;__init__.py&quot; を忘れないでください。</p>\n<aside class=\"admonition-development-server-won-t-automatically-restart admonition\" role=\"note\">\n<p class=\"admonition-title\">開発用サーバが自動的にリスタートしない場合</p>\n<p><code class=\"docutils literal notranslate\">templatetags</code> モジュールを追加した後、テンプレートでタグやフィルタを使用する前に、サーバーを再起動する必要があります。</p>\n</aside>\n<p>カスタムタグやフィルタは <code class=\"docutils literal notranslate\">templatetags</code> ディレクトリ内のモジュールにあります。モジュールファイルの名前は、あとでタグをロードして使うので、別のアプリでカスタムタグやフィルタと衝突しない名前を選択するように心がけてください。</p>\n<p>例えば、カスタムタグ/フィルタが <code class=\"docutils literal notranslate\">poll_extras.py</code> というファイルにある場合、アプリのレイアウトは次のようになります:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>polls/\n    __init__.py\n    models.py\n    templatetags/\n        __init__.py\n        poll_extras.py\n    views.py\n</code></pre></div>\n<p>そして、テンプレートでは次のように使います:</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\">load</span> <span class=\"nv\">poll_extras</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>カスタムタグを含むアプリケーションは、<a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\">{% load %}</code></a> タグを機能させるために <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 内に記述される必要があります。これは、セキュリティ機能です: 毎回の Django のインストールでこれらへのアクセスを有効化することなく、単一のホストマシン上の多数のテンプレートライブラリに対して Python のコードをホストできるようにします。</p>\n<p><code class=\"docutils literal notranslate\">templatetags</code> パッケージに入れられるモジュールの数に制限はありません。ただ、<a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\">{% load %}</code></a> ステートメントは、アプリケーションの名前ではなく、与えられた Python のモジュール名に対してタグ/フィルタをロードすることに注意してください。</p>\n<p>有効なタグライブラリにするため、モジュールは、<code class=\"docutils literal notranslate\">register</code> という名前のモジュールレベルの変数を含む必要があります。これは、すべてのタグとフィルタが登録されている <code class=\"docutils literal notranslate\">template.Library</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=\"nn\">django</span> <span class=\"kn\">import</span> template\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n</code></pre></div>\n<p>あるいは、テンプレートタグのモジュールは、<a class=\"reference internal\" href=\"/ja/6.1/topics/templates/#django.template.backends.django.DjangoTemplates\" title=\"django.template.backends.django.DjangoTemplates\"><code class=\"xref py py-class docutils literal notranslate\">DjangoTemplates</code></a> への <code class=\"docutils literal notranslate\">'libraries'</code> 引数を通じて登録することもできます。テンプレートタグをロードするときに、テンプレートタグのモジュール名とは異なるラベルを使用したい場合に便利です。また、アプリケーションをインストールせずに、タグを登録できるようになります。</p>\n<aside class=\"admonition-behind-the-scenes admonition\" role=\"note\">\n<p class=\"admonition-title\">背景</p>\n<p>豊富な例については、 Django のデフォルトのフィルタとタグのソースコードを読んでください。それぞれ <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/template/defaultfilters.py\">django/template/defaultfilters.py</a> と <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/template/defaulttags.py\">django/template/defaulttags.py</a> にあります。</p>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\">load</code></a> タグの詳細については、ドキュメントを参照してください。</p>\n</aside>\n</section>\n<section id=\"writing-custom-template-filters\">\n<span id=\"howto-writing-custom-template-filters\"></span><h2>独自のテンプレートフィルタを記述する<a class=\"heading-anchor\" href=\"#writing-custom-template-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>独自のフィルタは、1つか2つの引数を取るPythonの関数です:</p>\n<ul class=\"simple\">\n<li><p>変数の値 (インプット) -- 文字列とは限りません。</p></li>\n<li><p>引数の値 -- デフォルト値を持つことも、完全に省略することもできます。</p></li>\n</ul>\n<p>例えば、フィルタ <code class=\"docutils literal notranslate\">{{ var|foo:&quot;bar&quot; }}</code> の中で、フィルタ <code class=\"docutils literal notranslate\">foo</code> は変数 <code class=\"docutils literal notranslate\">var</code> と引数 <code class=\"docutils literal notranslate\">&quot;bar&quot;</code> を渡されます。</p>\n<p>テンプレート言語は例外処理を提供しないので、テンプレートフィルタから生成された例外はすべてサーバーエラーとして公開されます。したがって、フィルタ関数は、返すべき妥当なフォールバック値がある場合には例外を発生させないようにする必要があります。テンプレートの明確なバグを表すインプットの場合、例外を発生させる方が、バグを隠すサイレントな失敗よりも適切でしょう。</p>\n<p>以下はフィルタ定義の例です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">cut</span><span class=\"p\">(</span>value<span class=\"p\">,</span> arg<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Removes all values of arg from the given string&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> value<span class=\"o\">.</span>replace<span class=\"p\">(</span>arg<span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>そして、以下はフィルタがどのように使われるかの例です:</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=\"nv\">somevariable</span><span class=\"o\">|</span><span class=\"nf\">cut</span><span class=\"s2\">:&quot;0&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>ほとんどのフィルタは引数を取りません。この場合、次のように関数の第2引数を省略してください:</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=\"k\">def</span> <span class=\"nf\">lower</span><span class=\"p\">(</span>value<span class=\"p\">):</span>  <span class=\"c1\"># Only one argument.</span>\n    <span class=\"sd\">&quot;&quot;&quot;Converts a string into all lowercase&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> value<span class=\"o\">.</span>lower<span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"registering-custom-filters\">\n<h3>独自のフィルタを登録する<a class=\"heading-anchor\" href=\"#registering-custom-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.filter\">\n<span class=\"sig-prename descclassname\">django.template.Library.</span><span class=\"sig-name descname\">filter</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.filter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>フィルタ定義を書き終わったら、Django のテンプレート言語で使用できるようにするため、<code class=\"docutils literal notranslate\">Library</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>register<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"s2\">&quot;cut&quot;</span><span class=\"p\">,</span> cut<span class=\"p\">)</span>\nregister<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"s2\">&quot;lower&quot;</span><span class=\"p\">,</span> lower<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Library.filter()</code> メソッドは 2 つの引数を取ります:</p>\n<ol class=\"arabic simple\">\n<li><p>フィルタの名前 -- 文字列です。</p></li>\n<li><p>編集用の関数 -- Python の関数です (文字列としての関数名ではありません)。</p></li>\n</ol>\n<p>代わりに <code class=\"docutils literal notranslate\">register.filter()</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=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;cut&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">cut</span><span class=\"p\">(</span>value<span class=\"p\">,</span> arg<span class=\"p\">):</span>\n    <span class=\"k\">return</span> value<span class=\"o\">.</span>replace<span class=\"p\">(</span>arg<span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>filter\n<span class=\"k\">def</span> <span class=\"nf\">lower</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">return</span> value<span class=\"o\">.</span>lower<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">name</code> 引数を省略した場合、上記の 2 番目の例と同じように、Django はフィルタ名として関数の名前を利用します。</p>\n<p>最後に、<code class=\"docutils literal notranslate\">register.filter()</code> は 3 つのキーワード引数 (<code class=\"docutils literal notranslate\">is_safe</code>、<code class=\"docutils literal notranslate\">needs_autoescape</code>、 <code class=\"docutils literal notranslate\">expects_localtime</code>) を受け入れます。これらの引数は、後述の <a class=\"reference internal\" href=\"#filters-auto-escaping\"><span class=\"std std-ref\">フィルタと自動エスケープ</span></a> と <a class=\"reference internal\" href=\"#filters-timezones\"><span class=\"std std-ref\">フィルタとタイムゾーン</span></a> の中で説明されています。</p>\n</section>\n<section id=\"template-filters-that-expect-strings\">\n<h3>文字列を要するテンプレートフィルタ<a class=\"heading-anchor\" href=\"#template-filters-that-expect-strings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.defaultfilters.stringfilter\">\n<span class=\"sig-prename descclassname\">django.template.defaultfilters.</span><span class=\"sig-name descname\">stringfilter</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.defaultfilters.stringfilter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>第 1 引数として文字数を要求するだけのテンプレートフィルタを記述している場合、デコレータ <code class=\"docutils literal notranslate\">stringfilter</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=\"nn\">django</span> <span class=\"kn\">import</span> template\n<span class=\"kn\">from</span> <span class=\"nn\">django.template.defaultfilters</span> <span class=\"kn\">import</span> stringfilter\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>filter\n<span class=\"nd\">@stringfilter</span>\n<span class=\"k\">def</span> <span class=\"nf\">lower</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">return</span> value<span class=\"o\">.</span>lower<span class=\"p\">()</span>\n</code></pre></div>\n<p>これにより、このフィルタに整数を渡したとしても <code class=\"docutils literal notranslate\">AttributeError</code> は発生しません。(整数は <code class=\"docutils literal notranslate\">lower()</code> メソッドを持ちませんが。)</p>\n</section>\n<section id=\"filters-and-auto-escaping\">\n<span id=\"filters-auto-escaping\"></span><h3>フィルタと自動エスケープ<a class=\"heading-anchor\" href=\"#filters-and-auto-escaping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>独自のフィルタを作成する場合、フィルタがDjangoの自動エスケープの挙動とどのように関連するか考慮してください。2種類の文字列がテンプレートコードに渡されることに留意してください:</p>\n<ul>\n<li><p><strong>Raw strings</strong> はPythonのネイティブの文字列です。出力時に、自動エスケープが有効な場合はエスケープされ、それ以外の場合は変更されません。</p></li>\n<li><p><strong>Safe strings</strong> は出力時にさらなるエスケープがされないように安全とマークされた文字列です。必要なエスケープはすでに行われています。これらはクライアント側でそのまま解釈されることを目的とした生のHTMLを含む出力によく利用されます。</p>\n<p>内部では、これらの文字列は <a class=\"reference internal\" href=\"/ja/6.1/ref/utils/#django.utils.safestring.SafeString\" title=\"django.utils.safestring.SafeString\"><code class=\"xref py py-class docutils literal notranslate\">SafeString</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=\"nn\">django.utils.safestring</span> <span class=\"kn\">import</span> SafeString\n\n<span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span>value<span class=\"p\">,</span> SafeString<span class=\"p\">):</span>\n    <span class=\"c1\"># Do something with the &quot;safe&quot; string.</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n</ul>\n<p>テンプレートフィルタのコードは、次の2つの状況のいずれかに当てはまります:</p>\n<ol class=\"arabic\">\n<li><p>フィルタが結果に新たにHTMLで安全でない文字 (<code class=\"docutils literal notranslate\">&lt;</code>, <code class=\"docutils literal notranslate\">&gt;</code>, <code class=\"docutils literal notranslate\">'</code>, <code class=\"docutils literal notranslate\">&quot;</code> or <code class=\"docutils literal notranslate\">&amp;</code>) を導入しない場合。この場合、Djangoにすべての自動エスケープ処理を任せることができます。フィルタ関数を登録する際に、 <code class=\"docutils literal notranslate\">is_safe</code> フラグを <code class=\"docutils literal notranslate\">True</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=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>is_safe<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">myfilter</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">return</span> value\n</code></pre></div>\n<p>このフラグは、&quot;安全&quot;な文字列がフィルタに渡された場合、結果も依然として&quot;安全&quot;であることをDjangoに伝えます。そして、安全でない文字列が渡された場合、必要に応じてDjangoが自動的にエスケープします。</p>\n<p>この場合、&quot;このフィルタは安全である ―― それはどんな非安全なHTMLも導入する可能性はない。&quot; と考えて構いません。</p>\n<p><code class=\"docutils literal notranslate\">is_safe</code> が必要な理由は、 <code class=\"docutils literal notranslate\">SafeData</code> オブジェクトを普通の <code class=\"docutils literal notranslate\">str</code> オブジェクトに変換するような標準的な文字列操作が多数存在し、これら全てを捉えることが非常に難しいため、Djangoではフィルタの処理が完了した後に問題を修正するためです。</p>\n<p>例えば、任意の入力の末尾に文字列 <code class=\"docutils literal notranslate\">xx</code> を追加するフィルタがあるとします。これは結果に危険なHTML文字を導入しません（元々存在していたものを除く）。よって、フィルタを <code class=\"docutils literal notranslate\">is_safe</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=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>is_safe<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">add_xx</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">xx&quot;</span> <span class=\"o\">%</span> value\n</code></pre></div>\n<p>このフィルタが自動エスケープが有効なテンプレートで使用される場合、入力が既に&quot;安全&quot;としてマークされていない限り、Djangoは出力をエスケープします。</p>\n<p>デフォルトでは <code class=\"docutils literal notranslate\">is_safe</code> は <code class=\"docutils literal notranslate\">False</code> ですが、それが必要でないフィルタでは省略できます。</p>\n<p>フィルタが本当に安全な文字列を安全なまま残すかどうかを判断するときには注意してください。文字を <em>除去</em> している場合、不注意で結果の中に不均衡なHTMLタグやエンティティが残ってしまうかもしれません。例えば、入力から <code class=\"docutils literal notranslate\">&gt;</code> を取り除くと <code class=\"docutils literal notranslate\">&lt;a&gt;</code> が <code class=\"docutils literal notranslate\">&lt;a</code> になってしまうかもしれません。同様に、セミコロン(<code class=\"docutils literal notranslate\">;</code>)を削除すると、<code class=\"docutils literal notranslate\">&amp;amp;</code> が <code class=\"docutils literal notranslate\">&amp;amp</code> に変わります。ほとんどの場合、ここまでトリッキーになることはありませんが、コードをレビューする際はこのような問題がないか注意してください。</p>\n<p>Marking a filter <code class=\"docutils literal notranslate\">is_safe</code> will coerce the filter's return value to\na string. If your filter should return a boolean or other non-string\nvalue, marking it <code class=\"docutils literal notranslate\">is_safe</code> will probably have unintended\nconsequences (such as converting a boolean False to the string\n'False').</p>\n</li>\n<li><p>または、フィルタのコードで必要なエスケープ処理を手動で行うこともできます。これは、結果に新しいHTMLマークアップを導入する場合に必要です。HTMLマークアップがさらにエスケープされないように、出力を安全としてマークしたい場合は、入力を自分で処理する必要があります。</p>\n<p>出力を安全な文字列としてマークするには <a class=\"reference internal\" href=\"/ja/6.1/ref/utils/#django.utils.safestring.mark_safe\" title=\"django.utils.safestring.mark_safe\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.safestring.mark_safe()</code></a> を使います。</p>\n<p>ただし注意が必要です。出力を安全としてマークするだけでは不十分です。本当にそれが <em>安全である</em> ことを確認する必要があり、行うべきことは自動エスケープが有効かどうかによって異なります。テンプレート作成者のために、自動エスケープがオンまたはオフのどちらのテンプレートでも操作できるフィルタを書くことが考えられます。</p>\n<p>フィルタが現在の自動エスケープの状態を知るためには、フィルタ関数を登録する際に <code class=\"docutils literal notranslate\">needs_autoescape</code> フラグを <code class=\"docutils literal notranslate\">True</code> に設定します。(このフラグを指定しない場合、デフォルトは <code class=\"docutils literal notranslate\">False</code> です)。このフラグは、追加のキーワード引数 <code class=\"docutils literal notranslate\">autoescape</code> をDjangoに渡すようにフィルタ関数に伝えます。この引数は自動エスケープが有効の場合は <code class=\"docutils literal notranslate\">True</code> 、そうでない場合は <code class=\"docutils literal notranslate\">False</code> となります。 <code class=\"docutils literal notranslate\">autoescape</code> パラメータのデフォルトは <code class=\"docutils literal notranslate\">True</code> に設定しておくことが推奨されます。これにより、Pythonコードから関数を呼び出したときにデフォルトでエスケープが有効になります。</p>\n<p>例えば、文字列の最初の文字を強調するフィルタを書いてみましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.html</span> <span class=\"kn\">import</span> conditional_escape\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.safestring</span> <span class=\"kn\">import</span> mark_safe\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>needs_autoescape<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">initial_letter_filter</span><span class=\"p\">(</span>text<span class=\"p\">,</span> autoescape<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    first<span class=\"p\">,</span> other <span class=\"o\">=</span> text<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> text<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n    <span class=\"k\">if</span> autoescape<span class=\"p\">:</span>\n        esc <span class=\"o\">=</span> conditional_escape\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        esc <span class=\"o\">=</span> <span class=\"k\">lambda</span> x<span class=\"p\">:</span> x\n    result <span class=\"o\">=</span> <span class=\"s2\">&quot;&lt;strong&gt;</span><span class=\"si\">%s</span><span class=\"s2\">&lt;/strong&gt;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>esc<span class=\"p\">(</span>first<span class=\"p\">),</span> esc<span class=\"p\">(</span>other<span class=\"p\">))</span>\n    <span class=\"k\">return</span> mark_safe<span class=\"p\">(</span>result<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">needs_autoescape</code> フラグと <code class=\"docutils literal notranslate\">autoescape</code> キーワード引数により、フィルタが呼び出された際に自動エスケープが有効かどうかを関数が知ることができます。 <code class=\"docutils literal notranslate\">autoescape</code> を使用して、入力データを <code class=\"docutils literal notranslate\">django.utils.html.conditional_escape</code> に通す必要があるかどうかを決定します（必要なければ、恒等関数を &quot;escapse&quot; 関数として使用します）。 <code class=\"docutils literal notranslate\">conditional_escape()</code> 関数は <code class=\"docutils literal notranslate\">escape()</code> に似ていますが、 <code class=\"docutils literal notranslate\">SafeData</code> インスタンス <strong>でない</strong> 入力のみをエスケープします。 <code class=\"docutils literal notranslate\">SafeData</code> インスタンスが <code class=\"docutils literal notranslate\">conditional_escape()</code> に渡された場合、データは変更されずにそのまま返されます。</p>\n<p>最後に、上の例では、HTMLがさらにエスケープされることなくテンプレートに直接挿入されるように、結果を安全としてマークすることを忘れないでください。</p>\n<p>この場合、 <code class=\"docutils literal notranslate\">is_safe</code> フラグを気にする必要はありません (フラグを指定しても何も問題はありませんが)。自動エスケープの問題を手動で処理して安全な文字列を返す場合、 <code class=\"docutils literal notranslate\">is_safe</code> フラグを指定しても何も変わりません。</p>\n</li>\n</ol>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>組み込みのフィルタを再利用するときに XSS 脆弱性を回避する</p>\n<p>Django に組み込みのフィルタは、適切な自動エスケープを行い、クロスサイトスクリプティング（XSS）の脆弱性を回避するために、デフォルトで <code class=\"docutils literal notranslate\">autoescape=True</code> となっています。</p>\n<p>古いバージョンの Django では、 <code class=\"docutils literal notranslate\">autoescape</code> のデフォルトは <code class=\"docutils literal notranslate\">None</code> ですので、 Django の組み込みのフィルタを再利用する際には注意してください。オートエスケープを有効にするには <code class=\"docutils literal notranslate\">autoescape=True</code> を渡す必要があります。</p>\n<p>例えば、 <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatefilter-urlize\"><code class=\"xref std std-tfilter docutils literal notranslate\">urlize</code></a> フィルタと <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatefilter-linebreaksbr\"><code class=\"xref std std-tfilter docutils literal notranslate\">linebreaksbr</code></a> フィルタを組み合わせた <code class=\"docutils literal notranslate\">urlize_and_linebreaks</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=\"nn\">django.template.defaultfilters</span> <span class=\"kn\">import</span> linebreaksbr<span class=\"p\">,</span> urlize\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>needs_autoescape<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">urlize_and_linebreaks</span><span class=\"p\">(</span>text<span class=\"p\">,</span> autoescape<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> linebreaksbr<span class=\"p\">(</span>urlize<span class=\"p\">(</span>text<span class=\"p\">,</span> autoescape<span class=\"o\">=</span>autoescape<span class=\"p\">),</span> autoescape<span class=\"o\">=</span>autoescape<span class=\"p\">)</span>\n</code></pre></div>\n<p>次のように使います:</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=\"nv\">comment</span><span class=\"o\">|</span><span class=\"nf\">urlize_and_linebreaks</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>これは以下と同等です:</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=\"nv\">comment</span><span class=\"o\">|</span><span class=\"nf\">urlize</span><span class=\"o\">|</span><span class=\"nf\">linebreaksbr</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"filters-and-time-zones\">\n<span id=\"filters-timezones\"></span><h3>フィルタとタイムゾーン<a class=\"heading-anchor\" href=\"#filters-and-time-zones\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime</code></a> オブジェクトを操作するカスタムフィルタを書く場合、通常は <code class=\"docutils literal notranslate\">expects_localtime</code> フラグを <code class=\"docutils literal notranslate\">True</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=\"nd\">@register</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>expects_localtime<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">businesshours</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"mi\">9</span> <span class=\"o\">&lt;=</span> value<span class=\"o\">.</span>hour <span class=\"o\">&lt;</span> <span class=\"mi\">17</span>\n    <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p>このフラグがセットされていると、フィルタの最初の引数がタイムゾーンを意識した datetime である場合、Django は <a class=\"reference internal\" href=\"/ja/6.1/topics/i18n/timezones/#time-zones-in-templates\"><span class=\"std std-ref\">テンプレートにおけるタイムゾーン変換ルール</span></a> に従って、フィルタに渡す前に現在のタイムゾーンに変換します。</p>\n</section>\n</section>\n<section id=\"writing-custom-template-tags\">\n<span id=\"howto-writing-custom-template-tags\"></span><h2>独自のテンプレートタグを記述する<a class=\"heading-anchor\" href=\"#writing-custom-template-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>タグはあらゆることができるため、フィルタより複雑です。Django は、ほとんどのタイプのタグを簡単に書けるように、多数のショートカットを提供しています。まず最初にこうしたショートカットを見てから、ショートカットでは機能が不足している場合にゼロからタグを書く方法を説明します。</p>\n<section id=\"simple-tags\">\n<span id=\"howto-custom-template-tags-simple-tags\"></span><h3>シンプルなタグ<a class=\"heading-anchor\" href=\"#simple-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.simple_tag\">\n<span class=\"sig-prename descclassname\">django.template.Library.</span><span class=\"sig-name descname\">simple_tag</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.simple_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>多くのテンプレートタグは、文字列やテンプレート変数などの引数を取り、入力引数と外部情報のみに基づいて処理を行った後、結果を返します。 たとえば、<code class=\"docutils literal notranslate\">current_time</code> タグはフォーマット文字列を受け取り、その時刻を適切な文字列フォーマットとして返します。</p>\n<p>これらのタイプのタグの作成を容易にするため、Django はヘルパー関数 <code class=\"docutils literal notranslate\">simple_tag</code> を提供しています。 この関数は <code class=\"docutils literal notranslate\">django.template.Library</code> のメソッドで、任意の数の引数を受け取る関数を取り、それを <code class=\"docutils literal notranslate\">render</code> 関数と上記で説明した他の必要なビットにラップし、そしてテンプレートシステムに登録します。</p>\n<p>私たちの <code class=\"docutils literal notranslate\">current_time</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\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>simple_tag\n<span class=\"k\">def</span> <span class=\"nf\">current_time</span><span class=\"p\">(</span>format_string<span class=\"p\">):</span>\n    <span class=\"k\">return</span> datetime<span class=\"o\">.</span>datetime<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>strftime<span class=\"p\">(</span>format_string<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">simple_tag</code> ヘルパー関数について、注意すべきことがいくつかあります:</p>\n<ul class=\"simple\">\n<li><p>必須の引数の数などのチェックは、すでにこの関数が呼ばれる時点までに完了しているため、自分でチェックをする必要はありません。</p></li>\n<li><p>引数を囲む引用符（もしあれば）はすでに取り除かれているので、プレーンな文字列を受け取ります。</p></li>\n<li><p>もし引数がテンプレート変数だった場合、テンプレート中でタグが呼ばれた時点の値が渡されます。テンプレート変数そのものが渡されるわけではありません。</p></li>\n</ul>\n<p>他のタグユーティリティとは異なり、 <code class=\"docutils literal notranslate\">simple_tag</code> は、テンプレートコンテキストが自動エスケープモードの場合、 <a class=\"reference internal\" href=\"/ja/6.1/ref/utils/#django.utils.html.conditional_escape\" title=\"django.utils.html.conditional_escape\"><code class=\"xref py py-func docutils literal notranslate\">conditional_escape()</code></a> を通して出力を渡します。</p>\n<p>追加のエスケープが不要な場合、コードに XSS 脆弱性が絶対にないと確信できるのであれば、 <a class=\"reference internal\" href=\"/ja/6.1/ref/utils/#django.utils.safestring.mark_safe\" title=\"django.utils.safestring.mark_safe\"><code class=\"xref py py-func docutils literal notranslate\">mark_safe()</code></a> を使う必要があります。小さな HTML コードを作成する場合は、 <code class=\"docutils literal notranslate\">mark_safe()</code> の代わりに <a class=\"reference internal\" href=\"/ja/6.1/ref/utils/#django.utils.html.format_html\" title=\"django.utils.html.format_html\"><code class=\"xref py py-func docutils literal notranslate\">format_html()</code></a> を使うことを強く推奨します。</p>\n<p>テンプレートタグの中からコンテキストにアクセスしたい場合、タグを登録する際に <code class=\"docutils literal notranslate\">takes_context</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=\"nd\">@register</span><span class=\"o\">.</span>simple_tag<span class=\"p\">(</span>takes_context<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">current_time</span><span class=\"p\">(</span>context<span class=\"p\">,</span> format_string<span class=\"p\">):</span>\n    timezone <span class=\"o\">=</span> context<span class=\"p\">[</span><span class=\"s2\">&quot;timezone&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> your_get_current_time_method<span class=\"p\">(</span>timezone<span class=\"p\">,</span> format_string<span class=\"p\">)</span>\n</code></pre></div>\n<p>最初の引数は <code class=\"docutils literal notranslate\">context</code> に <em>しなければならない</em> ことに注意してください。</p>\n<p><code class=\"docutils literal notranslate\">takes_context</code> オプションがどのように動くかについて、詳しくは <a class=\"reference internal\" href=\"#howto-custom-template-tags-inclusion-tags\"><span class=\"std std-ref\">inclusion tag</span></a> を参照してください。</p>\n<p>タグの名前を変更する必要がある場合は、カスタム名を指定できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>register<span class=\"o\">.</span>simple_tag<span class=\"p\">(</span><span class=\"k\">lambda</span> x<span class=\"p\">:</span> x <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;minusone&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>simple_tag<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;minustwo&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">some_function</span><span class=\"p\">(</span>value<span class=\"p\">):</span>\n    <span class=\"k\">return</span> value <span class=\"o\">-</span> <span class=\"mi\">2</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">simple_tag</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=\"nd\">@register</span><span class=\"o\">.</span>simple_tag\n<span class=\"k\">def</span> <span class=\"nf\">my_tag</span><span class=\"p\">(</span>a<span class=\"p\">,</span> b<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    warning <span class=\"o\">=</span> kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;warning&quot;</span><span class=\"p\">]</span>\n    profile <span class=\"o\">=</span> kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;profile&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">return</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>このようにすることで、テンプレートからはスペースで区切られた変数をいくつでもテンプレートタグに渡すことができます。Pythonの文法と同じように、キーワード引数の値は等号（&quot;<code class=\"docutils literal notranslate\">=</code>&quot;）を用いて位置引数の後に記述します。たとえば：</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\">my_tag</span> <span class=\"m\">123</span> <span class=\"s2\">&quot;abcd&quot;</span> <span class=\"nv\">book.title</span> <span class=\"nv\">warning</span><span class=\"o\">=</span><span class=\"nv\">message</span><span class=\"o\">|</span><span class=\"nf\">lower</span> <span class=\"nv\">profile</span><span class=\"o\">=</span><span class=\"nv\">user.profile</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>タグの処理結果を直接出力することのほかに、テンプレート変数に格納することも可能です。これは <code class=\"docutils literal notranslate\">as</code> に続けて変数名を書くことで実現可能です。これによって、タグの処理結果を好きなように出力することができるようになります。</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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">the_time</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{{</span> <span class=\"nv\">the_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"simple-block-tags\">\n<span id=\"howto-custom-template-tags-simple-block-tags\"></span><h3>シンプル・ブロック・タグ<a class=\"heading-anchor\" href=\"#simple-block-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.simple_block_tag\">\n<span class=\"sig-prename descclassname\">django.template.Library.</span><span class=\"sig-name descname\">simple_block_tag</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.simple_block_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>When a section of rendered template needs to be passed into a custom tag,\nDjango provides the <code class=\"docutils literal notranslate\">simple_block_tag</code> helper function to accomplish this.\nSimilar to <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\">simple_tag()</code></a>, this function accepts\na custom tag function, but with the additional <code class=\"docutils literal notranslate\">content</code> argument, which\ncontains the rendered content as defined inside the tag. This allows dynamic\ntemplate sections to be easily incorporated into custom tags.</p>\n<p>たとえば、チャートを生成するカスタムブロックタグは次のように書けます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.charts</span> <span class=\"kn\">import</span> render_chart\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>simple_block_tag\n<span class=\"k\">def</span> <span class=\"nf\">chart</span><span class=\"p\">(</span>content<span class=\"p\">):</span>\n    <span class=\"k\">return</span> render_chart<span class=\"p\">(</span>source<span class=\"o\">=</span>content<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">content</code> 引数には、<code class=\"docutils literal notranslate\">{% chart %}</code> と <code class=\"docutils literal notranslate\">{% endchart %}</code> タグの間に書かれた内容がすべて入っています：</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\">chart</span> <span class=\"cp\">%}</span>\n  digraph G {\n      label = &quot;Chart for <span class=\"cp\">{{</span> <span class=\"nv\">request.user</span> <span class=\"cp\">}}</span>&quot;\n      A -&gt; {B C}\n  }\n<span class=\"cp\">{%</span> <span class=\"k\">endchart</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">content</code> ブロック内に他のテンプレートタグや変数が含まれている場合、それらはタグ関数に渡される前にレンダリングされます。上記の例では、 <code class=\"docutils literal notranslate\">render_chart</code> が呼び出される時点で <code class=\"docutils literal notranslate\">request.user</code> はすでに解決されています。</p>\n<p>ブロックタグは <code class=\"docutils literal notranslate\">end{name}</code> （たとえば <code class=\"docutils literal notranslate\">endchart</code> ）で閉じます。この閉じタグの名前は、<code class=\"docutils literal notranslate\">end_name</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=\"nd\">@register</span><span class=\"o\">.</span>simple_block_tag<span class=\"p\">(</span>end_name<span class=\"o\">=</span><span class=\"s2\">&quot;endofchart&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">chart</span><span class=\"p\">(</span>content<span class=\"p\">):</span>\n    <span class=\"k\">return</span> render_chart<span class=\"p\">(</span>source<span class=\"o\">=</span>content<span class=\"p\">)</span>\n</code></pre></div>\n<p>この場合、テンプレートの定義は次のように書く必要があります：</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\">chart</span> <span class=\"cp\">%}</span>\n  digraph G {\n      label = &quot;Chart for <span class=\"cp\">{{</span> <span class=\"nv\">request.user</span> <span class=\"cp\">}}</span>&quot;\n      A -&gt; {B C}\n  }\n<span class=\"cp\">{%</span> <span class=\"k\">endofchart</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">simple_block_tag</code> を使うときは、注意すべき点がいくつかあります：</p>\n<ul class=\"simple\">\n<li><p>最初の引数の名前は必ず <code class=\"docutils literal notranslate\">content</code> にする必要があり、ここにタグ内の内容がレンダリング済みの文字列として渡されます。</p></li>\n<li><p>タグに渡された変数は、 <code class=\"docutils literal notranslate\">content</code> のレンダリング時のコンテキストには含まれません。 <code class=\"docutils literal notranslate\">{% with %}</code> タグを使ったときとは異なります。</p></li>\n</ul>\n<p><a class=\"reference internal\" href=\"#howto-custom-template-tags-simple-tags\"><span class=\"std std-ref\">simple_tag</span></a> と同じように、<code class=\"docutils literal notranslate\">simple_block_tag</code> にも次のような機能があります：</p>\n<ul class=\"simple\">\n<li><p>引数の数や内容を検証します。</p></li>\n<li><p>必要に応じて、引数からクォート（引用符）を取り除きます。</p></li>\n<li><p>出力を適切にエスケープします。</p></li>\n<li><p>登録時に <code class=\"docutils literal notranslate\">takes_context=True</code> を指定することで、コンテキストへのアクセスに対応します（この場合、カスタム関数の最初の引数は <code class=\"docutils literal notranslate\">context</code> という名前でなければならず、続けて <code class=\"docutils literal notranslate\">content</code> を指定する必要があります）。</p></li>\n<li><p><code class=\"docutils literal notranslate\">name</code> 引数を使って、タグの名前を変更できます。</p></li>\n<li><p>任意の数の位置引数やキーワード引数を受け取れます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">as</code> 形式を使って、結果をテンプレート変数に格納できます。</p></li>\n</ul>\n<aside class=\"admonition-content-escaping admonition\" role=\"note\">\n<p class=\"admonition-title\">コンテンツのエスケープ</p>\n<p><code class=\"docutils literal notranslate\">simple_block_tag</code> は、エスケープの挙動については <code class=\"docutils literal notranslate\">simple_tag</code> とほぼ同じ動作をします。エスケープ処理や安全性の詳細については、 <code class=\"docutils literal notranslate\">simple_tag</code> の説明を参照してください。 <code class=\"docutils literal notranslate\">content</code> 引数は Django によってすでにレンダリングされているため、エスケープもすでに適用済みです。</p>\n</aside>\n<section id=\"a-complete-example\">\n<h4>完全な例<a class=\"heading-anchor\" href=\"#a-complete-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>単なるフレーズではなく、複数のメッセージレベルを持つメッセージボックスを生成するカスタムテンプレートタグを考えてみましょう。これは、 <code class=\"docutils literal notranslate\">simple_block_tag</code> を使って次のように実装できます：</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">testapp/templatetags/testapptags.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.html</span> <span class=\"kn\">import</span> format_html\n\nregister <span class=\"o\">=</span> template<span class=\"o\">.</span>Library<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>simple_block_tag<span class=\"p\">(</span>takes_context<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">msgbox</span><span class=\"p\">(</span>context<span class=\"p\">,</span> content<span class=\"p\">,</span> level<span class=\"p\">):</span>\n    format_kwargs <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> level<span class=\"o\">.</span>lower<span class=\"p\">(),</span>\n        <span class=\"s2\">&quot;level_title&quot;</span><span class=\"p\">:</span> level<span class=\"o\">.</span>capitalize<span class=\"p\">(),</span>\n        <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">:</span> content<span class=\"p\">,</span>\n        <span class=\"s2\">&quot;open&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot; open&quot;</span> <span class=\"k\">if</span> level<span class=\"o\">.</span>lower<span class=\"p\">()</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;error&quot;</span> <span class=\"k\">else</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;site&quot;</span><span class=\"p\">:</span> context<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;site&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;My Site&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">}</span>\n    result <span class=\"o\">=</span> <span class=\"s2\">&quot;&quot;&quot;</span>\n<span class=\"s2\">    &lt;div class=&quot;msgbox </span><span class=\"si\">{level}</span><span class=\"s2\">&quot;&gt;</span>\n<span class=\"s2\">      &lt;details</span><span class=\"si\">{open}</span><span class=\"s2\">&gt;</span>\n<span class=\"s2\">        &lt;summary&gt;</span>\n<span class=\"s2\">          &lt;strong&gt;</span><span class=\"si\">{level_title}</span><span class=\"s2\">&lt;/strong&gt;: Please read for &lt;i&gt;</span><span class=\"si\">{site}</span><span class=\"s2\">&lt;/i&gt;</span>\n<span class=\"s2\">        &lt;/summary&gt;</span>\n<span class=\"s2\">        &lt;p&gt;</span>\n<span class=\"s2\">          </span><span class=\"si\">{content}</span>\n<span class=\"s2\">        &lt;/p&gt;</span>\n<span class=\"s2\">      &lt;/details&gt;</span>\n<span class=\"s2\">    &lt;/div&gt;</span>\n<span class=\"s2\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> format_html<span class=\"p\">(</span>result<span class=\"p\">,</span> <span class=\"o\">**</span>format_kwargs<span class=\"p\">)</span>\n</code></pre></figure>\n<p>最小限のビューと、それに対応するテンプレートは次のようになります：</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">testapp/views.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n\n\n<span class=\"k\">def</span> <span class=\"nf\">simpleblocktag_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;test.html&quot;</span><span class=\"p\">,</span> context<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Important Site&quot;</span><span class=\"p\">})</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">testapp/templates/test.html</code></figcaption>\n<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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">testapptags</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n\n  <span class=\"cp\">{%</span> <span class=\"k\">msgbox</span> <span class=\"nv\">level</span><span class=\"o\">=</span><span class=\"s2\">&quot;error&quot;</span> <span class=\"cp\">%}</span>\n    Please fix all errors. Further documentation can be found at\n    <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://example.com&quot;</span><span class=\"p\">&gt;</span>Docs<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n  <span class=\"cp\">{%</span> <span class=\"k\">endmsgbox</span> <span class=\"cp\">%}</span>\n\n  <span class=\"cp\">{%</span> <span class=\"k\">msgbox</span> <span class=\"nv\">level</span><span class=\"o\">=</span><span class=\"s2\">&quot;info&quot;</span> <span class=\"cp\">%}</span>\n    More information at: <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://othersite.com&quot;</span><span class=\"p\">&gt;</span>Other Site<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>/\n  <span class=\"cp\">{%</span> <span class=\"k\">endmsgbox</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>レンダリングの結果、次のような HTML が生成されます：</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</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=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;msgbox error&quot;</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">details</span> <span class=\"na\">open</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>Error<span class=\"p\">&lt;/</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>: Please read for <span class=\"p\">&lt;</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>Important Site<span class=\"p\">&lt;/</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      Please fix all errors. Further documentation can be found at\n      <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://example.com&quot;</span><span class=\"p\">&gt;</span>Docs<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n    <span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;msgbox info&quot;</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>Info<span class=\"p\">&lt;/</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>: Please read for <span class=\"p\">&lt;</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>Important Site<span class=\"p\">&lt;/</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      More information at: <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://othersite.com&quot;</span><span class=\"p\">&gt;</span>Other Site<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"inclusion-tags\">\n<span id=\"howto-custom-template-tags-inclusion-tags\"></span><h3>Inclusion tag (インクルージョン・タグ)<a class=\"heading-anchor\" href=\"#inclusion-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.inclusion_tag\">\n<span class=\"sig-prename descclassname\">django.template.Library.</span><span class=\"sig-name descname\">inclusion_tag</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.inclusion_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>テンプレートタグのもう一つの一般的なタイプは、 <em>別の</em> テンプレートをレンダリングしてデータを表示するものです。例えば、 Django の admin インタフェースでは、カスタムテンプレートタグを使って、&quot;add/change&quot; フォームページの下にあるボタンを表示しています。これらのボタンはいつも同じように見えますが、編集中のオブジェクトによってリンク先が変わります -- なので、現在のオブジェクトの詳細で埋められた小さなテンプレートを使うのに最適なケースです。(admin の場合、これは <code class=\"docutils literal notranslate\">submit_row</code> タグです)。</p>\n<p>この種のタグは &quot;inclusion tag&quot; と呼ばれます。</p>\n<p>Inclusion tag の書き方は例で示すのが一番わかりやすいでしょう。 <a class=\"reference internal\" href=\"/ja/6.1/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">チュートリアル</span></a> で作成したような、与えられた <code class=\"docutils literal notranslate\">Poll</code> オブジェクトの選択肢のリストを出力するタグを書いてみましょう。タグはこのように使います:</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\">show_results</span> <span class=\"nv\">poll</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>...そして出力は次のようになります:</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</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=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>First choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>Second choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>Third choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>まず、引数を受け取り、結果のデータの辞書を生成する関数を定義します。ここで重要なのは、辞書を返すだけでよく、それ以上複雑なものは必要ないということです。これは、テンプレートの断片のテンプレート・コンテキストとして使用されます。例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">show_results</span><span class=\"p\">(</span>poll<span class=\"p\">):</span>\n    choices <span class=\"o\">=</span> poll<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"s2\">&quot;choices&quot;</span><span class=\"p\">:</span> choices<span class=\"p\">}</span>\n</code></pre></div>\n<p>次に、タグの出力をレンダリングするためのテンプレートを作成します。このテンプレートはタグの固定機能であり、テンプレート設計者ではなく、タグ作成者が指定します。この例では、テンプレートはとても短いです:</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=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">choice</span> <span class=\"k\">in</span> <span class=\"nv\">choices</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span> <span class=\"cp\">{{</span> <span class=\"nv\">choice</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</code></pre></div>\n<p>次に、 <code class=\"docutils literal notranslate\">Library</code> オブジェクトの <code class=\"docutils literal notranslate\">inclusion_tag()</code> メソッドを呼び出して、 inclusion tag を作成し、登録します。例に従って、上記のテンプレートがテンプレートローダーによって検索されるディレクトリの <code class=\"docutils literal notranslate\">results.html</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=\"c1\"># Here, register is a django.template.Library instance, as before</span>\n<span class=\"nd\">@register</span><span class=\"o\">.</span>inclusion_tag<span class=\"p\">(</span><span class=\"s2\">&quot;results.html&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">show_results</span><span class=\"p\">(</span>poll<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>あるいは、 <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\">django.template.Template</code></a> インスタンスを使って inclusion tag を登録することもできます:</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=\"nn\">django.template.loader</span> <span class=\"kn\">import</span> get_template\n\nt <span class=\"o\">=</span> get_template<span class=\"p\">(</span><span class=\"s2\">&quot;results.html&quot;</span><span class=\"p\">)</span>\nregister<span class=\"o\">.</span>inclusion_tag<span class=\"p\">(</span>t<span class=\"p\">)(</span>show_results<span class=\"p\">)</span>\n</code></pre></div>\n<p>…これは、関数を最初に作成する際に行います。</p>\n<p>時に、 inclusion tag は多くの引数を要求することがあり、テンプレート作者が全ての引数を渡したり、引数の順番を覚えたりするのは面倒です。これを解決するために、 Django は inclusion tag に <code class=\"docutils literal notranslate\">takes_context</code> オプションを用意しています。テンプレートタグを作成する際に <code class=\"docutils literal notranslate\">takes_context</code> を指定すると、タグには必要な引数がなくなり、 Python 関数の引数は 1 つになります――タグが呼び出された時点のテンプレートコンテキストです。</p>\n<p>例えば、メインページを指す <code class=\"docutils literal notranslate\">home_link</code> と <code class=\"docutils literal notranslate\">home_title</code> 変数を含むコンテキストの中で常に使用される inclusion tag を書くとします。Python の関数は次のようになります:</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=\"nd\">@register</span><span class=\"o\">.</span>inclusion_tag<span class=\"p\">(</span><span class=\"s2\">&quot;link.html&quot;</span><span class=\"p\">,</span> takes_context<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">jump_link</span><span class=\"p\">(</span>context<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;link&quot;</span><span class=\"p\">:</span> context<span class=\"p\">[</span><span class=\"s2\">&quot;home_link&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> context<span class=\"p\">[</span><span class=\"s2\">&quot;home_title&quot;</span><span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>最初の引数は <code class=\"docutils literal notranslate\">context</code> に <em>しなければならない</em> ことに注意してください。</p>\n<p>この <code class=\"docutils literal notranslate\">register.inclusion_tag()</code> の行では、 <code class=\"docutils literal notranslate\">takes_context=True</code> と、テンプレートの名前を指定しています。テンプレート <code class=\"docutils literal notranslate\">link.html</code> は以下のようになるでしょう:</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>Jump directly to <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">link</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n</code></pre></div>\n<p>そして、そのカスタムタグを使いたいときはいつでも、そのライブラリをロードして、引数なしで次のように呼び出します:</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\">jump_link</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">takes_context=True</code> を使用している場合、テンプレートタグに引数を渡す必要がないことに注意してください。自動的に context にアクセスします。</p>\n<p><code class=\"docutils literal notranslate\">takes_context</code> パラメータのデフォルトは <code class=\"docutils literal notranslate\">False</code> です。これを <code class=\"docutils literal notranslate\">True</code> に設定すると、この例のようにタグに context オブジェクトが渡されます。これが先ほどの <code class=\"docutils literal notranslate\">inclusion_tag</code> の例との唯一の違いです。</p>\n<p><code class=\"docutils literal notranslate\">inclusion_tag</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=\"nd\">@register</span><span class=\"o\">.</span>inclusion_tag<span class=\"p\">(</span><span class=\"s2\">&quot;my_template.html&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_tag</span><span class=\"p\">(</span>a<span class=\"p\">,</span> b<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    warning <span class=\"o\">=</span> kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;warning&quot;</span><span class=\"p\">]</span>\n    profile <span class=\"o\">=</span> kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;profile&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">return</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>このようにすることで、テンプレートからはスペースで区切られた変数をいくつでもテンプレートタグに渡すことができます。Pythonの文法と同じように、キーワード引数の値は等号（&quot;<code class=\"docutils literal notranslate\">=</code>&quot;）を用いて位置引数の後に記述します。たとえば：</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\">my_tag</span> <span class=\"m\">123</span> <span class=\"s2\">&quot;abcd&quot;</span> <span class=\"nv\">book.title</span> <span class=\"nv\">warning</span><span class=\"o\">=</span><span class=\"nv\">message</span><span class=\"o\">|</span><span class=\"nf\">lower</span> <span class=\"nv\">profile</span><span class=\"o\">=</span><span class=\"nv\">user.profile</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"advanced-custom-template-tags\">\n<h3>高度なカスタムテンプレートタグ<a class=\"heading-anchor\" href=\"#advanced-custom-template-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタムテンプレートタグを作成するための基本的な機能だけでは不十分な場合があります。ご心配なく、 Django はテンプレートタグを一から構築するのに必要な内部機能への完全なアクセスを提供します。</p>\n</section>\n<section id=\"a-quick-overview\">\n<h3>簡単な概要<a class=\"heading-anchor\" href=\"#a-quick-overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>テンプレート・システムは、コンパイルとレンダリングの 2 段階のプロセスで動作します。カスタムテンプレートタグを定義するには、コンパイルの仕組みとレンダリングの仕組みを指定します。</p>\n<p>When Django compiles a template, it splits the raw template text into <em>nodes</em>.\nEach node is an instance of <code class=\"docutils literal notranslate\">django.template.Node</code> and has a <code class=\"docutils literal notranslate\">render()</code>\nmethod. A compiled template is a list of <code class=\"docutils literal notranslate\">Node</code> objects. When you call\n<code class=\"docutils literal notranslate\">render()</code> on a compiled template object, the template calls <code class=\"docutils literal notranslate\">render()</code> on\neach <code class=\"docutils literal notranslate\">Node</code> in its node list, with the given context. The results are all\nconcatenated together to form the output of the template.</p>\n<p>このように、カスタムテンプレートタグを定義するには、生のテンプレートタグを <code class=\"docutils literal notranslate\">Node</code> に変換する方法（コンパイル関数）と、ノードの <code class=\"docutils literal notranslate\">render()</code> メソッドの動作を指定します。</p>\n</section>\n<section id=\"writing-the-compilation-function\">\n<h3>コンパイル関数の書き方<a class=\"heading-anchor\" href=\"#writing-the-compilation-function\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>テンプレートパーサーが見つけたそれぞれのテンプレートタグに対して、タグの内容とパーサーオブジェクト自身を使って Python 関数を呼び出します。この関数はタグの内容に基づいて <code class=\"docutils literal notranslate\">Node</code> インスタンスを返す役割を担います。</p>\n<p>例えば、テンプレートタグの完全な実装である <code class=\"docutils literal notranslate\">{% current_time %}</code> を書いてみましょう。このタグは <a class=\"reference external\" href=\"https://docs.python.org/3/library/time.html#time.strftime\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">strftime()</code></a> という構文で、タグで与えられたパラメータに従ってフォーマットされた現在の日時を表示します。何よりも先にタグの構文を決めるのは良いアイデアです。この場合、タグは次のように使用します:</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=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{%</span> <span class=\"k\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>この関数のパーサは、パラメータを取得して <code class=\"docutils literal notranslate\">Node</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=\"nn\">django</span> <span class=\"kn\">import</span> template\n\n\n<span class=\"k\">def</span> <span class=\"nf\">do_current_time</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># split_contents() knows not to split quoted strings.</span>\n        tag_name<span class=\"p\">,</span> format_string <span class=\"o\">=</span> token<span class=\"o\">.</span>split_contents<span class=\"p\">()</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires a single argument&quot;</span> <span class=\"o\">%</span> token<span class=\"o\">.</span>contents<span class=\"o\">.</span>split<span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span>format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> format_string<span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> tag_name\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> CurrentTimeNode<span class=\"p\">(</span>format_string<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>メモ:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">parser</code> はテンプレートパーサーオブジェクトです。この例では不要です。</p></li>\n<li><p><code class=\"docutils literal notranslate\">token.contents</code> はタグの生の内容を表す文字列です。この例では <code class=\"docutils literal notranslate\">'current_time &quot;%Y-%m-%d %I:%M %p&quot;'</code> です。</p></li>\n<li><p><code class=\"docutils literal notranslate\">token.split_contents()</code> メソッドは、引用符で囲まれた文字列はそのままに、引数をスペースで分割します。より単純な <code class=\"docutils literal notranslate\">token.contents.split()</code> を使用すると、引用符で囲まれた文字列内を含む <em>すべての</em> スペースで単純に分割してしまうため、それほど堅牢ではありません。常に <code class=\"docutils literal notranslate\">token.split_contents()</code> を使用することをお勧めします。</p></li>\n<li><p>この関数は構文エラーに対して <code class=\"docutils literal notranslate\">django.template.TemplateSyntaxError</code> を親切なメッセージとともに発生させます。</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">TemplateSyntaxError</code> exceptions use the <code class=\"docutils literal notranslate\">tag_name</code> variable.\nDon't hardcode the tag's name in your error messages, because that\ncouples the tag's name to your function. <code class=\"docutils literal notranslate\">token.contents.split()[0]</code>\nwill <em>always</em> be the name of your tag -- even when the tag has no arguments.</p></li>\n<li><p>この関数は、ノードがこのタグについて知る必要があるすべての情報を含む <code class=\"docutils literal notranslate\">CurrentTimeNode</code> を返します。この場合、引数 <code class=\"docutils literal notranslate\">&quot;%Y-%m-%d %I:%M %p&quot;</code> を渡します。 <code class=\"docutils literal notranslate\">format_string[1:-1]</code> では、テンプレートタグの先頭と末尾の引用符が取り除かれます。</p></li>\n<li><p>構文解析は非常に低レベルです。Django の開発者は、 EBNF 文法などのテクニックを使って、この構文解析システムの上に小さなフレームワークを書く実験をしましたが、 その実験ではテンプレートエンジンが遅すぎました。 低レベルなのは、それが最速だからです。</p></li>\n</ul>\n</section>\n<section id=\"writing-the-renderer\">\n<h3>レンダラーの書き方<a class=\"heading-anchor\" href=\"#writing-the-renderer\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタムタグを書く2つ目のステップは、 <code class=\"docutils literal notranslate\">render()</code> メソッドを持つ <code class=\"docutils literal notranslate\">Node</code> サブクラスを定義することです。</p>\n<p>上記の例の続きで、 <code class=\"docutils literal notranslate\">CurrentTimeNode</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\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CurrentTimeNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> format_string<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>format_string <span class=\"o\">=</span> format_string\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">return</span> datetime<span class=\"o\">.</span>datetime<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>strftime<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>format_string<span class=\"p\">)</span>\n</code></pre></div>\n<p>メモ:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">__init__()</code> は <code class=\"docutils literal notranslate\">do_current_time()</code> から <code class=\"docutils literal notranslate\">format_string</code> を取得します。オプションやパラメータ、引数は常に <code class=\"docutils literal notranslate\">Node</code> の <code class=\"docutils literal notranslate\">__init__()</code> から渡します。</p></li>\n<li><p><code class=\"docutils literal notranslate\">render()</code> メソッドは、実際に処理が行われる場所です。</p></li>\n<li><p>特に実運用環境では、 <code class=\"docutils literal notranslate\">render()</code> は通常は静かに失敗するべきです。しかし、場合によっては、特に <code class=\"docutils literal notranslate\">context.template.engine.debug</code> が <code class=\"docutils literal notranslate\">True</code> の場合、このメソッドはデバッグを容易にするために例外を発生させることがあります。例えば、いくつかのコアタグは、引数の数や型を間違えると <code class=\"docutils literal notranslate\">django.template.TemplateSyntaxError</code> を発生させます。</p></li>\n</ul>\n<p>最終的に、コンパイルとレンダリングを切り離すことで、効率的なテンプレートシステムが実現します。なぜなら、テンプレートは何度もパースされることなく、複数のコンテキストをレンダリングできるからです。</p>\n</section>\n<section id=\"auto-escaping-considerations\">\n<span id=\"tags-auto-escaping\"></span><h3>自動エスケープに関する注意点<a class=\"heading-anchor\" href=\"#auto-escaping-considerations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>テンプレートタグからの出力は自動エスケープフィルタに自動的に通されることは <strong>ありません</strong> (上で説明した <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\">simple_tag()</code></a> は例外です)。しかし、テンプレートタグを書く際に注意すべき点がいくつかあります。</p>\n<p>テンプレートタグの <code class=\"docutils literal notranslate\">render()</code> メソッドが(結果を文字列で返すのではなく)コンテキスト変数に結果を格納する場合、適切であれば <code class=\"docutils literal notranslate\">mark_safe()</code> を呼び出すように注意しなければなりません。変数が最終的にレンダリングされるとき、その時点で有効な自動エスケープ設定の影響を受けます、そのため、さらなるエスケープから安全であるべきコンテンツは、そのようにマークされる必要があります。</p>\n<p>また、テンプレートタグがサブレンダリングを行うために新しいコンテキストを作成する場合、auto-escape 属性に現在のコンテキストの値を指定します。 <code class=\"docutils literal notranslate\">Context</code> クラスの <code class=\"docutils literal notranslate\">__init__</code> メソッドはこの目的で使用できる <code class=\"docutils literal notranslate\">autoescape</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=\"nn\">django.template</span> <span class=\"kn\">import</span> Context\n\n\n<span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    new_context <span class=\"o\">=</span> Context<span class=\"p\">({</span><span class=\"s2\">&quot;var&quot;</span><span class=\"p\">:</span> obj<span class=\"p\">},</span> autoescape<span class=\"o\">=</span>context<span class=\"o\">.</span>autoescape<span class=\"p\">)</span>\n    <span class=\"c1\"># ... Do something with new_context ...</span>\n</code></pre></div>\n<p>これはあまり一般的な状況ではありませんが、テンプレートを自分でレンダリングする場合に便利です。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n    t <span class=\"o\">=</span> context<span class=\"o\">.</span>template<span class=\"o\">.</span>engine<span class=\"o\">.</span>get_template<span class=\"p\">(</span><span class=\"s2\">&quot;small_fragment.html&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> t<span class=\"o\">.</span>render<span class=\"p\">(</span>Context<span class=\"p\">({</span><span class=\"s2\">&quot;var&quot;</span><span class=\"p\">:</span> obj<span class=\"p\">},</span> autoescape<span class=\"o\">=</span>context<span class=\"o\">.</span>autoescape<span class=\"p\">))</span>\n</code></pre></div>\n<p>もしこの例で、現在の <code class=\"docutils literal notranslate\">context.autoescape</code> の値を新しい <code class=\"docutils literal notranslate\">Context</code> に渡すのを怠っていたら、結果は <em>常に</em> 自動的にエスケープされていたでしょう。これは、テンプレートタグが <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\">{% autoescape off %}</code></a> ブロックの中で使用されている場合、望ましい動作ではないかもしれません。</p>\n</section>\n<section id=\"thread-safety-considerations\">\n<span id=\"template-tag-thread-safety\"></span><h3>スレッド安全性の考慮<a class=\"heading-anchor\" href=\"#thread-safety-considerations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ノードがパースされると、その <code class=\"docutils literal notranslate\">render</code> メソッドは何度でも呼び出されます。Django はマルチスレッド環境で実行されることがあるので、1つのノードが2つのリクエストに応答して、異なるコンテキストで同時にレンダリングされることがあります。したがって、テンプレートタグをスレッドセーフにすることが重要です。</p>\n<p>テンプレートタグを常にスレッドセーフに保つため、ノード自体に状態情報を保存してはいけません。例えば、 Django にはレンダリングされる度に与えられた文字列のリストを循環させる <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-cycle\"><code class=\"xref std std-ttag docutils literal notranslate\">cycle</code></a> テンプレートタグが用意されています:</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\">for</span> <span class=\"nv\">o</span> <span class=\"k\">in</span> <span class=\"nv\">some_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">tr</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">cycle</span> <span class=\"s1\">&#39;row1&#39;</span> <span class=\"s1\">&#39;row2&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n        ...\n    <span class=\"p\">&lt;/</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>ナイーブな <code class=\"docutils literal notranslate\">CycleNode</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\">import</span> <span class=\"nn\">itertools</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CycleNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> cyclevars<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>cycle_iter <span class=\"o\">=</span> itertools<span class=\"o\">.</span>cycle<span class=\"p\">(</span>cyclevars<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">next</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>cycle_iter<span class=\"p\">)</span>\n</code></pre></div>\n<p>しかし、上のテンプレートコードを同時にレンダリングする2つのテンプレートがあるとします:</p>\n<ol class=\"arabic simple\">\n<li><p>スレッド1が最初のループを実行し、 <code class=\"docutils literal notranslate\">CycleNode.render()</code> は 'row1' を返します。</p></li>\n<li><p>スレッド2が最初のループを実行し、 <code class=\"docutils literal notranslate\">CycleNode.render()</code> は 'row2' を返します。</p></li>\n<li><p>スレッド1が2回目のループを実行し、 <code class=\"docutils literal notranslate\">CycleNode.render()</code> は 'row1' を返します。</p></li>\n<li><p>スレッド2が2回目のループを実行し、 <code class=\"docutils literal notranslate\">CycleNode.render()</code> は 'row2' を返します。</p></li>\n</ol>\n<p>CycleNodeは反復していますが、グローバルに反復しています。スレッド1とスレッド2に関しては、常に同じ値を返しています。これは私たちが望んでいることではありません！</p>\n<p>この問題に対処するために、 Django は <code class=\"docutils literal notranslate\">render_context</code> を提供します。この <code class=\"docutils literal notranslate\">render_context</code> は、現在レンダリング中のテンプレートの <code class=\"docutils literal notranslate\">context</code> に関連付けられます。この <code class=\"docutils literal notranslate\">render_context</code> は Python の辞書のように動作し、 <code class=\"docutils literal notranslate\">render</code> メソッドを呼び出す間の <code class=\"docutils literal notranslate\">Node</code> の状態を保存するために使う必要があります。</p>\n<p><code class=\"docutils literal notranslate\">CycleNode</code> の実装を <code class=\"docutils literal notranslate\">render_context</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=\"k\">class</span> <span class=\"nc\">CycleNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> cyclevars<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>cyclevars <span class=\"o\">=</span> cyclevars\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> context<span class=\"o\">.</span>render_context<span class=\"p\">:</span>\n            context<span class=\"o\">.</span>render_context<span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"p\">]</span> <span class=\"o\">=</span> itertools<span class=\"o\">.</span>cycle<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>cyclevars<span class=\"p\">)</span>\n        cycle_iter <span class=\"o\">=</span> context<span class=\"o\">.</span>render_context<span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"nb\">next</span><span class=\"p\">(</span>cycle_iter<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Node</code> のライフサイクルを通して変化しないグローバルな情報を属性として保存することは完全に安全であることに注意してください。 <code class=\"docutils literal notranslate\">CycleNode</code> の場合、 <code class=\"docutils literal notranslate\">Node</code> がインスタンス化された後も <code class=\"docutils literal notranslate\">cyclevars</code> 引数は変化しないので、 <code class=\"docutils literal notranslate\">render_context</code> に格納する必要はありません。しかし、 <code class=\"docutils literal notranslate\">CycleNode</code> の現在の繰り返し処理のように、現在レンダリングされているテンプレートに固有の状態情報は <code class=\"docutils literal notranslate\">render_context</code> に格納する必要があります。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\">self</code> を使用して <code class=\"docutils literal notranslate\">render_context</code> 内の <code class=\"docutils literal notranslate\">CycleNode</code> 固有の情報をスコープしていることに注意してください。 テンプレート内には複数の <code class=\"docutils literal notranslate\">CycleNode</code> が存在する可能性があるので、別のノードの状態情報を上書きしないよう注意する必要があります。最も簡単な方法は、常に <code class=\"docutils literal notranslate\">render_context</code> のキーとして <code class=\"docutils literal notranslate\">self</code> を使用することです。複数の状態変数を管理している場合は、 <code class=\"docutils literal notranslate\">render_context[self]</code> を辞書にします。</p>\n</aside>\n</section>\n<section id=\"registering-the-tag\">\n<h3>タグを登録する<a class=\"heading-anchor\" href=\"#registering-the-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>最後に、上記の <a class=\"reference internal\" href=\"#howto-writing-custom-template-tags\"><span class=\"std std-ref\">カスタムテンプレートタグを書く</span></a> で説明したように、タグをモジュールの <code class=\"docutils literal notranslate\">Library</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>register<span class=\"o\">.</span>tag<span class=\"p\">(</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">,</span> do_current_time<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">tag()</code> メソッドは次の2つの引数を取ります。</p>\n<ol class=\"arabic simple\">\n<li><p>テンプレート タグの名前の文字列。これを省略した場合は、コンパイル関数の名前が使用されます。</p></li>\n<li><p>編集用の関数 -- Python の関数です (文字列としての関数名ではありません)。</p></li>\n</ol>\n<p>フィルタ登録と同様に、これをデコレータとして使うこともできます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span>tag<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">do_current_time</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span>tag\n<span class=\"k\">def</span> <span class=\"nf\">shout</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">name</code> 引数を省略した場合、上記の2番目の例と同じように、Django はタグ名として関数の名前を利用します。</p>\n</section>\n<section id=\"passing-template-variables-to-the-tag\">\n<h3>テンプレート変数をタグに渡す<a class=\"heading-anchor\" href=\"#passing-template-variables-to-the-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">token.split_contents()</code> を使用するテンプレート タグには任意の個数の引数を渡せますが、引数はすべて文字列リテラルとしてアンパックされます。動的なコンテンツ (テンプレート変数) をテンプレートタグに引数として渡すためには、少し追加の作業が必要になります。</p>\n<p>前の例では現在時刻を文字列にフォーマットして文字列として返しましたが、オブジェクトから <a class=\"reference internal\" href=\"/ja/6.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> を渡したくて、テンプレートタグがその値を date-time とフォーマットとするとすると、次のように書けます。</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=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This post was last updated at <span class=\"cp\">{%</span> <span class=\"k\">format_time</span> <span class=\"nv\">blog_entry.date_updated</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>最初に、<code class=\"docutils literal notranslate\">token.split_contents()</code> が3つの値を返します。</p>\n<ol class=\"arabic simple\">\n<li><p>タグ名 <code class=\"docutils literal notranslate\">format_time</code>。</p></li>\n<li><p>文字列 <code class=\"docutils literal notranslate\">'blog_entry.date_updated'</code> (両側のクオートは含まない)</p></li>\n<li><p>フォーマット文字列 <code class=\"docutils literal notranslate\">'&quot;%Y-%m-%d %I:%M %p&quot;'</code>。<code class=\"docutils literal notranslate\">split_contents()</code> からの返り値は、このように文字列リテラルの前後にクオートを含みます。</p></li>\n</ol>\n<p>これで、タグは次のようになります。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n\n\n<span class=\"k\">def</span> <span class=\"nf\">do_format_time</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># split_contents() knows not to split quoted strings.</span>\n        tag_name<span class=\"p\">,</span> date_to_be_formatted<span class=\"p\">,</span> format_string <span class=\"o\">=</span> token<span class=\"o\">.</span>split_contents<span class=\"p\">()</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires exactly two arguments&quot;</span> <span class=\"o\">%</span> token<span class=\"o\">.</span>contents<span class=\"o\">.</span>split<span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span>format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> format_string<span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> tag_name\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> FormatTimeNode<span class=\"p\">(</span>date_to_be_formatted<span class=\"p\">,</span> format_string<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>You also have to change the renderer to retrieve the actual contents of the\n<code class=\"docutils literal notranslate\">date_updated</code> property of the <code class=\"docutils literal notranslate\">blog_entry</code> object. This can be\naccomplished by using the <code class=\"docutils literal notranslate\">Variable()</code> class in <code class=\"docutils literal notranslate\">django.template</code>.</p>\n<p><code class=\"docutils literal notranslate\">Variable</code> クラスを使うには、クラスを解決されるべき変数名でインスタンス化した後に、<code class=\"docutils literal notranslate\">variable.resolve(context)</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=\"k\">class</span> <span class=\"nc\">FormatTimeNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> date_to_be_formatted<span class=\"p\">,</span> format_string<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>date_to_be_formatted <span class=\"o\">=</span> template<span class=\"o\">.</span>Variable<span class=\"p\">(</span>date_to_be_formatted<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>format_string <span class=\"o\">=</span> format_string\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            actual_date <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>date_to_be_formatted<span class=\"o\">.</span>resolve<span class=\"p\">(</span>context<span class=\"p\">)</span>\n            <span class=\"k\">return</span> actual_date<span class=\"o\">.</span>strftime<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>format_string<span class=\"p\">)</span>\n        <span class=\"k\">except</span> template<span class=\"o\">.</span>VariableDoesNotExist<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p>ページの現在のコンテキスト内で渡された文字列が解決できない場合、変数を解決しようとすると <code class=\"docutils literal notranslate\">VariableDoesNotExist</code> 例外が発生します。</p>\n</section>\n<section id=\"setting-a-variable-in-the-context\">\n<h3>コンテキスト内で変数を設定する<a class=\"heading-anchor\" href=\"#setting-a-variable-in-the-context\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>上記の例は値を出力します。一般に、テンプレートタグは値を出力する代わりに、テンプレート変数を設定するほうがより柔軟です。それにより、テンプレートの作者はテンプレートタグが作成した値を再利用できるようになります。</p>\n<p>コンテキスト内に変数を設定するには、<code class=\"docutils literal notranslate\">render()</code> メソッド内で、コンテキスト オブジェクト上のディクショナリ代入を使います。以下は、出力する代わりにテンプレート変数 <code class=\"docutils literal notranslate\">current_time</code> を設定する、更新されたバージョンの <code class=\"docutils literal notranslate\">CurrentTimeNode</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\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> template\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CurrentTimeNode2</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> format_string<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>format_string <span class=\"o\">=</span> format_string\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        context<span class=\"p\">[</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> datetime<span class=\"o\">.</span>datetime<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>strftime<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>format_string<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">render()</code> は空の文字列を返すことに注意してください。<code class=\"docutils literal notranslate\">render()</code> はつねに文字列の出力を返します。すべてのテンプレートタグが変数の設定だけを行う場合、<code class=\"docutils literal notranslate\">render()</code> は空の文字列を返す必要があります。</p>\n<p>この新しいバージョンのタグの使い方はこちらです。</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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{{</span> <span class=\"nv\">current_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-variable-scope-in-context admonition\" role=\"note\">\n<p class=\"admonition-title\">コンテキスト内の変数のスコープ</p>\n<p>コンテキストに設定された変数は、その変数が割り当てられたテンプレートの同じ <code class=\"docutils literal notranslate\">block</code> でのみ使用できます。 この動作は意図的なもので、他のブロックのコンテキストと衝突しないように、変数にスコープを提供します。</p>\n</aside>\n<p>But, there's a problem with <code class=\"docutils literal notranslate\">CurrentTimeNode2</code>: The variable name\n<code class=\"docutils literal notranslate\">current_time</code> is hardcoded. This means you'll need to make sure your\ntemplate doesn't use <code class=\"docutils literal notranslate\">{{ current_time }}</code> anywhere else, because the\n<code class=\"docutils literal notranslate\">{% current_time %}</code> will blindly overwrite that variable's value. A cleaner\nsolution is to make the template tag specify the name of the output variable,\nlike so:</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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">my_current_time</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The current time is <span class=\"cp\">{{</span> <span class=\"nv\">my_current_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>そのためには、コンパイル関数と <code class=\"docutils literal notranslate\">Node</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\">import</span> <span class=\"nn\">re</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CurrentTimeNode3</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> format_string<span class=\"p\">,</span> var_name<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>format_string <span class=\"o\">=</span> format_string\n        <span class=\"bp\">self</span><span class=\"o\">.</span>var_name <span class=\"o\">=</span> var_name\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        context<span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span>var_name<span class=\"p\">]</span> <span class=\"o\">=</span> datetime<span class=\"o\">.</span>datetime<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>strftime<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>format_string<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">do_current_time</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span>\n    <span class=\"c1\"># This version uses a regular expression to parse tag contents.</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Splitting by None == splitting by spaces.</span>\n        tag_name<span class=\"p\">,</span> arg <span class=\"o\">=</span> token<span class=\"o\">.</span>contents<span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires arguments&quot;</span> <span class=\"o\">%</span> token<span class=\"o\">.</span>contents<span class=\"o\">.</span>split<span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    m <span class=\"o\">=</span> re<span class=\"o\">.</span>search<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;(.*?) as (\\w+)&quot;</span><span class=\"p\">,</span> arg<span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> m<span class=\"p\">:</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag had invalid arguments&quot;</span> <span class=\"o\">%</span> tag_name<span class=\"p\">)</span>\n    format_string<span class=\"p\">,</span> var_name <span class=\"o\">=</span> m<span class=\"o\">.</span>groups<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span>format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> format_string<span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> format_string<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> template<span class=\"o\">.</span>TemplateSyntaxError<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> tag_name\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> CurrentTimeNode3<span class=\"p\">(</span>format_string<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">],</span> var_name<span class=\"p\">)</span>\n</code></pre></div>\n<p>ここでの違いは、 <code class=\"docutils literal notranslate\">do_current_time()</code> がフォーマット文字列と変数名を取得し、その両方を <code class=\"docutils literal notranslate\">CurrentTimeNode3</code> に渡していることです。</p>\n<p>最後に、コンテキストを更新するカスタムテンプレートタグの簡単な構文が必要なだけなら、 <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\">simple_tag()</code></a> ショートカットを使うことを検討してください 。 このショートカットは、タグの結果をテンプレート変数に代入することをサポートしています。</p>\n</section>\n<section id=\"parsing-until-another-block-tag\">\n<h3>他のブロックタグまでパースする<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>テンプレートタグは連動して動作します。例えば、標準の <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\">{% comment %}</code></a> タグは <code class=\"docutils literal notranslate\">{% endcomment %}</code> まですべてを隠蔽します。このようなテンプレートタグを作成するには、コンパイル関数の中で <code class=\"docutils literal notranslate\">parser.parse()</code> を使います。</p>\n<p>以下は <code class=\"docutils literal notranslate\">{% comment %}</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=\"k\">def</span> <span class=\"nf\">do_comment</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span>\n    nodelist <span class=\"o\">=</span> parser<span class=\"o\">.</span>parse<span class=\"p\">((</span><span class=\"s2\">&quot;endcomment&quot;</span><span class=\"p\">,))</span>\n    parser<span class=\"o\">.</span>delete_first_token<span class=\"p\">()</span>\n    <span class=\"k\">return</span> CommentNode<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CommentNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>実際の <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\">{% comment %}</code></a> の実装は少し異なり、 <code class=\"docutils literal notranslate\">{% comment %}</code> と <code class=\"docutils literal notranslate\">{% endcomment %}</code> の間に壊れたテンプレートタグを表示することを許可します。これは <code class=\"docutils literal notranslate\">parser.parse(('endcomment',))</code> の代わりに <code class=\"docutils literal notranslate\">parser.skip_past('endcomment')</code> を呼び出し、その後に <code class=\"docutils literal notranslate\">parser.delete_first_token()</code> を実行することで、ノードリストの生成を回避しています。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\">parser.parse()</code> takes a tuple of names of block tags <em>to parse until</em>. It\nreturns an instance of <code class=\"docutils literal notranslate\">django.template.NodeList</code>, which is a list of\nall <code class=\"docutils literal notranslate\">Node</code> objects that the parser encountered <em>before</em> it encountered\nany of the tags named in the tuple.</p>\n<p>上の例 <code class=\"docutils literal notranslate\">&quot;nodelist = parser.parse(('endcomment',))&quot;</code> において、 <code class=\"docutils literal notranslate\">nodelist</code> は <code class=\"docutils literal notranslate\">{% comment %}</code> と <code class=\"docutils literal notranslate\">{% endcomment %}</code> の間にある全てのノードのリストであり、 <code class=\"docutils literal notranslate\">{% comment %}</code> と <code class=\"docutils literal notranslate\">{% endcomment %}</code> 自体は含まれません。</p>\n<p><code class=\"docutils literal notranslate\">parser.parse()</code> が呼ばれた後、パーサはまだ <code class=\"docutils literal notranslate\">{% endcomment %}</code> タグを &quot;消費&quot; していないので、コードは明示的に <code class=\"docutils literal notranslate\">parser.delete_first_token()</code> を呼び出す必要があります。</p>\n<p><code class=\"docutils literal notranslate\">CommentNode.render()</code> は空の文字列を返します。 <code class=\"docutils literal notranslate\">{% comment %}</code> と <code class=\"docutils literal notranslate\">{% endcomment %}</code> の間はすべて無視されます。</p>\n</section>\n<section id=\"parsing-until-another-block-tag-and-saving-contents\">\n<h3>別のブロックタグまでのパースと内容の保存<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag-and-saving-contents\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>先ほどの例では、 <code class=\"docutils literal notranslate\">do_comment()</code> は <code class=\"docutils literal notranslate\">{% comment %}</code> と <code class=\"docutils literal notranslate\">{% endcomment %}</code> の間をすべて破棄していました。その代わりに、ブロックタグの間のコードで好きなことができます。</p>\n<p>例えば、これはカスタムテンプレートタグ <code class=\"docutils literal notranslate\">{% upper %}</code> で、それ自身と <code class=\"docutils literal notranslate\">{% endupper %}</code> の間をすべて大文字にします。</p>\n<p>使い方:</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\">upper</span> <span class=\"cp\">%}</span>This will appear in uppercase, <span class=\"cp\">{{</span> <span class=\"nv\">your_name</span> <span class=\"cp\">}}</span>.<span class=\"cp\">{%</span> <span class=\"k\">endupper</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>上の例と同様に <code class=\"docutils literal notranslate\">parser.parse()</code> を使いますが、今回は次のように、結果の <code class=\"docutils literal notranslate\">nodelist</code> を <code class=\"docutils literal notranslate\">Node</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=\"k\">def</span> <span class=\"nf\">do_upper</span><span class=\"p\">(</span>parser<span class=\"p\">,</span> token<span class=\"p\">):</span>\n    nodelist <span class=\"o\">=</span> parser<span class=\"o\">.</span>parse<span class=\"p\">((</span><span class=\"s2\">&quot;endupper&quot;</span><span class=\"p\">,))</span>\n    parser<span class=\"o\">.</span>delete_first_token<span class=\"p\">()</span>\n    <span class=\"k\">return</span> UpperNode<span class=\"p\">(</span>nodelist<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UpperNode</span><span class=\"p\">(</span>template<span class=\"o\">.</span>Node<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> nodelist<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>nodelist <span class=\"o\">=</span> nodelist\n\n    <span class=\"k\">def</span> <span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        output <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>nodelist<span class=\"o\">.</span>render<span class=\"p\">(</span>context<span class=\"p\">)</span>\n        <span class=\"k\">return</span> output<span class=\"o\">.</span>upper<span class=\"p\">()</span>\n</code></pre></div>\n<p>ここで唯一の新しい概念は、<code class=\"docutils literal notranslate\">UpperNode.render()</code> 内の <code class=\"docutils literal notranslate\">self.nodelist.render(context)</code> だけです。</p>\n<p>複雑なレンダリングの追加の例としては、<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/template/defaulttags.py\">django/template/defaulttags.py</a> 内の <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\">{% for %}</code></a> や <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/template/smartif.py\">django/template/smartif.py</a> 内の <a class=\"reference internal\" href=\"/ja/6.1/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\">{% if %}</code></a> のソースコードを見てください。</p>\n</section>\n</section>","rootId":"how-to-create-custom-template-tags-and-filters","toc":[{"title":"コードのレイアウト","anchor":"code-layout","children":[]},{"title":"独自のテンプレートフィルタを記述する","anchor":"writing-custom-template-filters","children":[{"title":"独自のフィルタを登録する","anchor":"registering-custom-filters","children":[]},{"title":"文字列を要するテンプレートフィルタ","anchor":"template-filters-that-expect-strings","children":[]},{"title":"フィルタと自動エスケープ","anchor":"filters-and-auto-escaping","children":[]},{"title":"フィルタとタイムゾーン","anchor":"filters-and-time-zones","children":[]}]},{"title":"独自のテンプレートタグを記述する","anchor":"writing-custom-template-tags","children":[{"title":"シンプルなタグ","anchor":"simple-tags","children":[]},{"title":"シンプル・ブロック・タグ","anchor":"simple-block-tags","children":[{"title":"完全な例","anchor":"a-complete-example","children":[]}]},{"title":"Inclusion tag (インクルージョン・タグ)","anchor":"inclusion-tags","children":[]},{"title":"高度なカスタムテンプレートタグ","anchor":"advanced-custom-template-tags","children":[]},{"title":"簡単な概要","anchor":"a-quick-overview","children":[]},{"title":"コンパイル関数の書き方","anchor":"writing-the-compilation-function","children":[]},{"title":"レンダラーの書き方","anchor":"writing-the-renderer","children":[]},{"title":"自動エスケープに関する注意点","anchor":"auto-escaping-considerations","children":[]},{"title":"スレッド安全性の考慮","anchor":"thread-safety-considerations","children":[]},{"title":"タグを登録する","anchor":"registering-the-tag","children":[]},{"title":"テンプレート変数をタグに渡す","anchor":"passing-template-variables-to-the-tag","children":[]},{"title":"コンテキスト内で変数を設定する","anchor":"setting-a-variable-in-the-context","children":[]},{"title":"他のブロックタグまでパースする","anchor":"parsing-until-another-block-tag","children":[]},{"title":"別のブロックタグまでのパースと内容の保存","anchor":"parsing-until-another-block-tag-and-saving-contents","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to ガイド","url":"/ja/6.1/howto/"}],"prev":{"docname":"howto/custom-template-backend","title":"テンプレートのバックエンドをカスタマイズする","url":"/ja/6.1/howto/custom-template-backend/"},"next":{"docname":"howto/static-files/index","title":"静的ファイル (画像、JavaScript、CSS など) を管理する","url":"/ja/6.1/howto/static-files/"},"formats":{"html":"/ja/6.1/howto/custom-template-tags/","markdown":"/ja/6.1/howto/custom-template-tags.md","json":"/ja/6.1/howto/custom-template-tags.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/custom-template-tags.txt","official":"https://docs.djangoproject.com/ja/6.1/howto/custom-template-tags/","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","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}