組み込みのテンプレートタグとフィルター—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/templates/builtins
移動先:案内検索

組み込みのテンプレートタグとフィルター

このドキュメントでは、Djangoの組み込みテンプレートタグとフィルターについて説明します。 可能な場合は、自動ドキュメントを使用することをお勧めします。これには、インストールされているカスタムタグまたはフィルターのドキュメントも含まれます。

組み込みのタグリファレンス

autoescape

現在の自動エスケープ動作を制御します。 このタグは、引数としてonまたはoffのいずれかを取り、ブロック内で自動エスケープが有効かどうかを決定します。 ブロックはendautoescape終了タグで閉じられます。

自動エスケープが有効になっている場合、結果を出力に配置する前に(ただし、フィルターが適用された後)、すべての可変コンテンツにHTMLエスケープが適用されます。 これは、:tfilter: `escape` フィルターを各変数に手動で適用するのと同じです。

唯一の例外は、変数に入力されたコードによって、または:tfilter: `safe` または:tfilter:が含まれているために、エスケープから「安全」とマークされている変数です。 `escape` フィルターが適用されました。

使用例:

{% autoescape on %}
    {{ body }}
{% endautoescape %}

block

子テンプレートでオーバーライドできるブロックを定義します。 詳細については、テンプレートの継承を参照してください。


comment

{% comment %}{% endcomment %}の間のすべてを無視します。 オプションのメモを最初のタグに挿入できます。 たとえば、これは、コードが無効にされた理由を文書化するためにコードをコメントアウトするときに役立ちます。

使用例:

<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

commentタグはネストできません。


csrf_token

このタグは、クロスサイトリクエストフォージェリのドキュメントで説明されているように、CSRF保護に使用されます。


cycle

このタグが検出されるたびに、引数の1つを生成します。 最初の引数は最初のエンカウンターで生成され、2番目の引数は2番目のエンカウンターで生成されます。 すべての引数が使い果たされると、タグは最初の引数に循環し、それを再度生成します。

このタグは、ループで特に役立ちます。

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

最初の反復では、クラスrow1を参照するHTMLが生成され、2番目はrow2を参照し、3番目はrow1を参照し、以下同様にループの反復ごとに行われます。

変数も使用できます。 たとえば、rowvalue1rowvalue2の2つのテンプレート変数がある場合、次のようにそれらの値を切り替えることができます。

{% for o in some_list %}
    <tr class="{% cycle rowvalue1 rowvalue2 %}">
        ...
    </tr>
{% endfor %}

サイクルに含まれる変数はエスケープされます。 次の方法で自動エスケープを無効にできます。

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}

変数と文字列を混在させることができます。

{% for o in some_list %}
    <tr class="{% cycle 'row1' rowvalue2 'row3' %}">
        ...
    </tr>
{% endfor %}

場合によっては、次の値に進まずに、サイクルの現在の値を参照したいことがあります。 これを行うには、次のように「as」を使用して{% cycle %}タグに名前を付けます。

{% cycle 'row1' 'row2' as rowcolors %}

それ以降は、サイクル名をコンテキスト変数として参照することで、テンプレートの任意の場所にサイクルの現在の値を挿入できます。 元のcycleタグとは関係なく、サイクルを次の値に移動する場合は、別のcycleタグを使用して、変数の名前を指定できます。 したがって、次のテンプレート:

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

出力します:

<tr>
    <td class="row1">...</td>
    <td class="row1">...</td>
</tr>
<tr>
    <td class="row2">...</td>
    <td class="row2">...</td>
</tr>

cycleタグでは、スペースで区切って任意の数の値を使用できます。 一重引用符(')または二重引用符(")で囲まれた値は文字列リテラルとして扱われ、引用符のない値はテンプレート変数として扱われます。

デフォルトでは、cycleタグでasキーワードを使用すると、サイクルを開始する{% cycle %}を使用すると、それ自体がサイクルの最初の値を生成します。 ネストされたループまたはインクルードされたテンプレートで値を使用する場合、これは問題になる可能性があります。 サイクルを宣言するだけで最初の値を生成しない場合は、タグの最後のキーワードとしてsilentキーワードを追加できます。 例えば:

{% for obj in some_list %}
    {% cycle 'row1' 'row2' as rowcolors silent %}
    <tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}

これにより、classrow1row2の間で交互になっている<tr>要素のリストが出力されます。 サブテンプレートは、そのコンテキストでrowcolorsにアクセスでき、値はそれを囲む<tr>のクラスと一致します。 silentキーワードを省略すると、row1row2は、<tr>要素の外側に通常のテキストとして出力されます。

サイクル定義でsilentキーワードが使用されると、その特定のサイクルタグの後続のすべての使用に無音が自動的に適用されます。 次のテンプレートは、{% cycle %}への2回目の呼び出しでsilentが指定されていなくても、 noneth を出力します。

{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}

:ttag: `resetcycle` タグを使用して、{% cycle %}タグを次に検出されたときに最初の値から再起動させることができます。


debug

現在のコンテキストとインポートされたモジュールを含む、デバッグ情報の全負荷を出力します。


extends

このテンプレートが親テンプレートを拡張していることを通知します。

このタグは、次の2つの方法で使用できます。

  • {% extends "base.html" %}(引用符付き)は、拡張する親テンプレートの名前としてリテラル値"base.html"を使用します。
  • {% extends variable %}variableの値を使用します。 変数が文字列に評価される場合、Djangoはその文字列を親テンプレートの名前として使用します。 変数がTemplateオブジェクトと評価された場合、Djangoはそのオブジェクトを親テンプレートとして使用します。

詳細については、テンプレートの継承を参照してください。

通常、テンプレート名は、テンプレートローダーのルートディレクトリを基準にしています。 文字列引数は、./または../で始まる相対パスの場合もあります。 たとえば、次のディレクトリ構造を想定します。

dir1/
    template.html
    base2.html
    my/
        base3.html
base1.html

template.htmlでは、次のパスが有効です。

{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}

filter

1つまたは複数のフィルターを使用してブロックの内容をフィルターします。 変数構文の場合と同様に、複数のフィルターをパイプで指定でき、フィルターに引数を含めることができます。

ブロックには、filterタグとendfilterタグの間のテキスト all が含まれていることに注意してください。

使用例:

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}

ノート

:tfilter: `escape` および:tfilter:` safe` フィルターは受け入れられない引数です。 代わりに、:ttag: `autoescape` タグを使用して、テンプレートコードのブロックの自動エスケープを管理します。


firstof

「false」ではない最初の引数変数を出力します(つまり、 存在し、空ではなく、偽のブール値ではなく、ゼロの数値でもありません)。 渡されたすべての変数が「false」の場合、何も出力しません。

使用例:

{% firstof var1 var2 var3 %}

これは次と同等です。

{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

渡されたすべての変数がFalseの場合、フォールバック値としてリテラル文字列を使用することもできます。

{% firstof var1 var2 var3 "fallback value" %}

このタグは、変数値を自動エスケープします。 次の方法で自動エスケープを無効にできます。

{% autoescape off %}
    {% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}

または、一部の変数のみをエスケープする必要がある場合は、次を使用できます。

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

構文{% firstof var1 var2 var3 as value %}を使用して、出力を変数内に格納できます。


for

配列内の各アイテムをループして、アイテムをコンテキスト変数で使用できるようにします。 たとえば、athlete_listで提供されているアスリートのリストを表示するには次のようにします。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

{% for obj in list reversed %}を使用すると、リストを逆にループできます。

リストのリストをループする必要がある場合は、各サブリストの値を個々の変数に解凍できます。 たとえば、コンテキストにpointsという(x、y)座標のリストが含まれている場合、以下を使用してポイントのリストを出力できます。

{% for x, y in points %}
    There is a point at {{ x }},{{ y }}
{% endfor %}

これは、辞書の項目にアクセスする必要がある場合にも役立ちます。 たとえば、コンテキストに辞書dataが含まれている場合、次のように辞書のキーと値が表示されます。

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

ドット演算子の場合、辞書キーのルックアップがメソッドのルックアップよりも優先されることに注意してください。 したがって、dataディクショナリに'items'という名前のキーが含まれている場合、data.itemsdata.items()ではなくdata['items']を返します。 テンプレートでこれらのメソッドを使用する場合は、辞書メソッドのような名前のキーを追加しないでください(itemsvalueskeysなど)。 ドット演算子のルックアップ順序の詳細については、テンプレート変数のドキュメントを参照してください。

forループは、ループ内で使用可能ないくつかの変数を設定します。

変数 説明
forloop.counter ループの現在の反復(1-インデックス付き)
forloop.counter0 ループの現在の反復(0-インデックス付き)
forloop.revcounter ループの終わりからの反復回数(1-インデックス付き)
forloop.revcounter0 ループの終わりからの反復回数(0-インデックス付き)
forloop.first ループを初めて通過する場合はTrue
forloop.last これがループを通過する最後の場合はTrue
forloop.parentloop ネストされたループの場合、これは現在のループを囲むループです。


for…empty

forタグは、オプションの{% empty %}句を使用できます。この句は、指定された配列が空であるか見つからなかった場合にテキストが表示されます。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

上記は、以下と同等ですが、より短く、よりクリーンで、場合によってはより高速です。

<ul>
  {% if athlete_list %}
    {% for athlete in athlete_list %}
      <li>{{ athlete.name }}</li>
    {% endfor %}
  {% else %}
    <li>Sorry, no athletes in this list.</li>
  {% endif %}
</ul>

if

{% if %}タグは変数を評価し、その変数が「真」であるかどうか(つまり、 存在し、空ではなく、偽のブール値ではありません)ブロックの内容が出力されます。

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

上記において、athlete_listが空でない場合、アスリートの数はテンプレート:Athlete list変数によって表示されます。

ご覧のとおり、ifタグには、1つまたは複数の{% elif %}句と、以前のすべての条件が満たされない場合に表示される{% else %}句が含まれる場合があります。 これらの句はオプションです。

ブール演算子

:ttag: `if` タグは、andor、またはnotを使用して、いくつかの変数をテストしたり、特定の変数を否定したりできます。

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

同じタグ内でand句とor句の両方を使用できます。andorよりも優先されます。例:

{% if athlete_list and coach_list or cheerleader_list %}

次のように解釈されます:

if (athlete_list and coach_list) or cheerleader_list

:ttag: `if` タグでの実際の括弧の使用は無効な構文です。 優先順位を示すためにそれらが必要な場合は、ネストされた:ttag: `if` タグを使用する必要があります。

:ttag: `if` タグでは、演算子==!=<>、 [ X100X]、>=innot inis、およびis notは、次のように機能します。

==演算子

平等。 例:

{% if somevar == "x" %}
  This appears if variable somevar equals the string "x"
{% endif %}
!=演算子

不平等。 例:

{% if somevar != "x" %}
  This appears if variable somevar does not equal the string "x",
  or if somevar is not found in the context
{% endif %}
<演算子

未満。 例:

{% if somevar < 100 %}
  This appears if variable somevar is less than 100.
{% endif %}
>演算子

大なり記号。 例:

{% if somevar > 0 %}
  This appears if variable somevar is greater than 0.
{% endif %}
<=演算子

以下。 例:

{% if somevar <= 100 %}
  This appears if variable somevar is less than 100 or equal to 100.
{% endif %}
>=演算子

以上。 例:

{% if somevar >= 1 %}
  This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}
in演算子

中に含まれています。 この演算子は、指定された値がコンテナー内にあるかどうかをテストするために、多くのPythonコンテナーでサポートされています。 以下は、x in yがどのように解釈されるかの例です。

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

{% if "hello" in greetings %}
  If greetings is a list or set, one element of which is the string
  "hello", this will appear.
{% endif %}

{% if user in users %}
  If users is a QuerySet, this will appear if user is an
  instance that belongs to the QuerySet.
{% endif %}
not in演算子

に含まれていません。 これは、in演算子の否定です。


is演算子

オブジェクトID。 2つの値が同じオブジェクトであるかどうかをテストします。 例:

{% if somevar is True %}
  This appears if and only if somevar is True.
{% endif %}

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
is not演算子

否定されたオブジェクトID。 2つの値が同じオブジェクトでないかどうかをテストします。 これは、is演算子の否定です。 例:

{% if somevar is not True %}
  This appears if somevar is not True, or if somevar is not found in the
  context.
{% endif %}

{% if somevar is not None %}
  This appears if and only if somevar is not None.
{% endif %}

フィルタ

:ttag: `if` 式でフィルターを使用することもできます。 例えば:

{% if messages|length >= 100 %}
   You have lots of messages today!
{% endif %}

複雑な式

上記のすべてを組み合わせて、複雑な式を形成できます。 このような式の場合、式が評価されるときに演算子がどのようにグループ化されるか、つまり優先順位ルールを知ることが重要になる場合があります。 演算子の優先順位は、低いものから高いものへと次のとおりです。

  • or
  • and
  • not
  • in
  • ==!=<><=>=

(これはPythonに正確に従います)。 したがって、たとえば、次の複雑な:ttag: `if` タグ:

{% if a == b or c == d and e %}

…次のように解釈されます:

(a == b) or ((c == d) and e)

別の優先順位が必要な場合は、ネストされた:ttag: `if` タグを使用する必要があります。 優先ルールを知らない人のために、とにかく明確にするためにそれが良い場合もあります。

比較演算子は、Pythonや数学表記のように「連鎖」させることはできません。 たとえば、次を使用する代わりに:

{% if a > b > c %}  (WRONG)

使用する必要があります:

{% if a > b and b > c %}

ifequalおよびifnotequal

バージョン3.1以降非推奨。


{% ifequal a b %} ... {% endifequal %}は、{% if a == b %} ... {% endif %}を記述するための廃止された方法です。 同様に、{% ifnotequal a b %} ... {% endifnotequal %}{% if a != b %} ... {% endif %}に置き換えられます。


ifchanged

ループの最後の反復から値が変更されているかどうかを確認します。

{% ifchanged %}ブロックタグはループ内で使用されます。 2つの用途があります。

  1. 自身のレンダリングされたコンテンツを以前の状態と照合し、コンテンツが変更された場合にのみ表示します。 たとえば、これは日のリストを表示し、月が変更された場合にのみ表示します。

    <h1>Archive for {{ year }}</h1>
    
    {% for date in days %}
        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
    {% endfor %}
  2. 1つ以上の変数が指定されている場合は、変数が変更されていないかどうかを確認してください。 たとえば、次のように変更されるたびに日付が表示され、時間または日付が変更された場合は時間が表示されます。

    {% for date in days %}
        {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
        {% ifchanged date.hour date.date %}
            {{ date.hour }}
        {% endifchanged %}
    {% endfor %}

ifchangedタグは、値が変更されていない場合に表示されるオプションの{% else %}句を取ることもできます。

{% for match in matches %}
    <div style="background-color:
        {% ifchanged match.ballot_id %}
            {% cycle "red" "blue" %}
        {% else %}
            gray
        {% endifchanged %}
    ">{{ match }}</div>
{% endfor %}

include

テンプレートをロードし、現在のコンテキストでレンダリングします。 これは、テンプレート内に他のテンプレートを「含める」方法です。

テンプレート名は、変数またはハードコードされた(引用符で囲まれた)文字列のいずれかで、一重引用符または二重引用符で囲むことができます。

この例には、テンプレート"foo/bar.html"のコンテンツが含まれています。

{% include "foo/bar.html" %}

通常、テンプレート名は、テンプレートローダーのルートディレクトリを基準にしています。 文字列引数は、:ttag: `extends` タグで説明されているように、./または../で始まる相対パスにすることもできます。

この例には、名前が変数template_nameに含まれているテンプレートのコンテンツが含まれています。

{% include template_name %}

変数は、コンテキストを受け入れるrender()メソッドを持つ任意のオブジェクトにすることもできます。 これにより、コンパイルされたTemplateをコンテキストで参照できます。

さらに、変数はテンプレート名の反復可能である場合があり、その場合、 select_template()に従って、ロードできる最初の名前が使用されます。

インクルードされたテンプレートは、それを含むテンプレートのコンテキスト内でレンダリングされます。 この例では、出力"Hello, John!"を生成します。

  • コンテキスト:変数person"John"に設定され、変数greeting"Hello"に設定されます。

  • レンプレート:

    {% include "name_snippet.html" %}
  • name_snippet.htmlテンプレート:

    {{ greeting }}, {{ person|default:"friend" }}!

キーワード引数を使用して、テンプレートに追加のコンテキストを渡すことができます。

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

提供された変数のみを使用して(または変数をまったく使用せずに)コンテキストをレンダリングする場合は、onlyオプションを使用します。 含まれているテンプレートで使用できる他の変数はありません。

{% include "name_snippet.html" with greeting="Hi" only %}

ノート

:ttag: `include` タグは、「このサブテンプレートを解析して、そのコンテンツを親の一部であるかのように含める」ではなく、「このサブテンプレートをレンダリングしてHTMLを含める」の実装と見なす必要があります。 。 これは、インクルードされたテンプレート間に共有状態がないことを意味します。各インクルードは完全に独立したレンダリングプロセスです。

ブロックは、含まれる前に評価されます。 つまり、別のブロックを含むテンプレートには、がすでに評価およびレンダリングされたのブロックが含まれます。たとえば、拡張テンプレートによってオーバーライドできるブロックは含まれません。


バージョン3.1で変更:テンプレート名の反復可能オブジェクトのサポートが追加されました。


load

カスタムテンプレートタグセットをロードします。

たとえば、次のテンプレートは、パッケージpackageにあるsomelibraryおよびotherlibraryに登録されているすべてのタグとフィルターをロードします。

{% load somelibrary package.otherlibrary %}

from引数を使用して、ライブラリから個々のフィルターまたはタグを選択的にロードすることもできます。 この例では、fooおよびbarという名前のテンプレートタグ/フィルターがsomelibraryからロードされます。

{% load foo bar from somelibrary %}

詳細については、カスタムタグおよびフィルターライブラリを参照してください。


lorem

ランダムな「loremipsum」ラテン語テキストを表示します。 これは、テンプレートでサンプルデータを提供する場合に役立ちます。

使用法:

{% lorem [count] [method] [random] %}

{% lorem %}タグは、0、1、2、または3つの引数で使用できます。 引数は次のとおりです。

口論 説明
count 生成する段落または単語の数を含む数値(または変数)(デフォルトは1)。
method 単語の場合はw、HTML段落の場合はp、プレーンテキストの段落ブロックの場合はb(デフォルトはb)。
random randomという単語は、指定された場合、テキストを生成するときに共通の段落( "Lorem ipsum dolor sit amet…")を使用しません。

例:

  • {% lorem %}は、一般的な「loremipsum」段落を出力します。
  • {% lorem 3 p %}は、共通の「lorem ipsum」段落と、それぞれHTML <p>タグでラップされた2つのランダムな段落を出力します。
  • {% lorem 2 w random %}は、2つのランダムなラテン語を出力します。


now

指定された文字列に従った形式を使用して、現在の日付や時刻を表示します。 このような文字列には、:tfilter: `date` フィルターセクションで説明されているフォーマット指定子文字を含めることができます。

例:

It is {% now "jS F Y H:i" %}

「raw」値を使用する場合は、フォーマット文字列をバックスラッシュエスケープできることに注意してください。 この例では、「o」と「f」の両方が円記号でエスケープされています。それ以外の場合、それぞれが年と時刻をそれぞれ表示するフォーマット文字列であるためです。

It is the {% now "jS \o\f F" %}

これは「9月4日です」と表示されます。

ノート

渡される形式は、事前定義された形式:setting: `DATE_FORMAT`:setting:` DATETIME_FORMAT`:setting: `SHORT_DATE_FORMAT` または:setting: `SHORT_DATETIME_FORMAT` 。 事前定義されたフォーマットは、現在のロケール、およびフォーマットローカリゼーションが有効になっているかどうかによって異なる場合があります。例:

It is {% now "SHORT_DATETIME_FORMAT" %}

構文{% now "Y" as current_year %}を使用して、出力を(文字列として)変数内に格納することもできます。 これは、:ttag: `blocktranslate` などのテンプレートタグ内で{% now %}を使用する場合に便利です。

{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}

regroup

類似オブジェクトのリストを共通の属性で再グループ化します。

この複雑なタグは、例として最もよく示されています。たとえば、citiesは、"name""population"、および"country"を含む辞書で表される都市のリストです。キー:

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

…そして、次のように国順に並べられた階層リストを表示したいとします。

  • インド
    • ムンバイ:19,000,000
    • カルカッタ:15,000,000
  • 米国
    • ニューヨーク:20,000,000
    • シカゴ:7,000,000
  • 日本
    • 東京:33,000,000

{% regroup %}タグを使用して、国ごとに都市のリストをグループ化できます。 次のテンプレートコードのスニペットはこれを実現します。

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for city in country.list %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

この例を見ていきましょう。 {% regroup %}は、再グループ化するリスト、グループ化する属性、および結果のリストの名前の3つの引数を取ります。 ここでは、citiesリストをcountry属性で再グループ化し、結果をcountry_listと呼んでいます。

{% regroup %}は、グループオブジェクトのリスト(この場合はcountry_list)を生成します。 グループオブジェクトは、次の2つのフィールドを持つnamedtuple()のインスタンスです。

  • grouper –グループ化されたアイテム(たとえば、文字列「India」または「Japan」)。
  • list –このグループのすべてのアイテムのリスト(たとえば、country = 'India'のすべての都市のリスト)。

{% regroup %}namedtuple()オブジェクトを生成するため、前の例を次のように記述することもできます。

{% regroup cities by country as country_list %}

<ul>
{% for country, local_cities in country_list %}
    <li>{{ country }}
    <ul>
        {% for city in local_cities %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

{% regroup %}は入力を順序付けしないことに注意してください。 この例は、citiesリストが最初にcountryによって順序付けられたという事実に依存しています。 citiesリストがではなくメンバーをcountryで並べ替えた場合、再グループ化により、1つの国に対して複数のグループが単純に表示されます。 たとえば、citiesリストがこれに設定されているとします(国はグループ化されていないことに注意してください)。

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

citiesのこの入力では、上記の{% regroup %}テンプレートコードの例は、次の出力になります。

  • インド
    • ムンバイ:19,000,000
  • 米国
    • ニューヨーク:20,000,000
  • インド
    • カルカッタ:15,000,000
  • 米国
    • シカゴ:7,000,000
  • 日本
    • 東京:33,000,000

この落とし穴の最も簡単な解決策は、ビューコードで、データの表示方法に従ってデータが並べ替えられていることを確認することです。

別の解決策は、データが辞書のリストにある場合、:tfilter: `dictsort` フィルターを使用してテンプレート内のデータを並べ替えることです。

{% regroup cities|dictsort:"country" by country as country_list %}

他のプロパティでのグループ化

有効なテンプレートルックアップは、メソッド、属性、辞書キー、リストアイテムなど、再グループ化タグの正当なグループ化属性です。 たとえば、「country」フィールドが属性「description」を持つクラスへの外部キーである場合、次を使用できます。

{% regroup cities by country.description as country_list %}

または、countrychoicesのフィールドである場合、属性として get_FOO_display()メソッドを使用できるため、 choicesキー:

{% regroup cities by get_country_display as country_list %}

テンプレート:Country.grouperは、キーではなく、choicesセットの値フィールドを表示するようになりました。


resetcycle

前のサイクルをリセットして、次の遭遇時に最初のアイテムから再開するようにします。 引数がない場合、{% resetcycle %}はテンプレートで定義された最後の{% cycle %}をリセットします。

使用例:

{% for coach in coach_list %}
    <h1>{{ coach.name }}</h1>
    {% for athlete in coach.athlete_set.all %}
        <p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
    {% endfor %}
    {% resetcycle %}
{% endfor %}

この例では、次のHTMLが返されます。

<h1>José Mourinho</h1>
<p class="odd">Thibaut Courtois</p>
<p class="even">John Terry</p>
<p class="odd">Eden Hazard</p>

<h1>Carlo Ancelotti</h1>
<p class="odd">Manuel Neuer</p>
<p class="even">Thomas Müller</p>

最初のブロックがclass="odd"で終わり、新しいブロックがclass="odd"で始まることに注目してください。 {% resetcycle %}タグがないと、2番目のブロックはclass="even"で始まります。

名前付きサイクルタグをリセットすることもできます。

{% for item in list %}
    <p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
        {{ item.data }}
    </p>
    {% ifchanged item.category %}
        <h1>{{ item.category }}</h1>
        {% if not forloop.first %}{% resetcycle tick %}{% endif %}
    {% endifchanged %}
{% endfor %}

この例では、奇数/偶数行が交互に表示され、5行ごとに「メジャー」行が表示されます。 カテゴリが変更されると、5行のサイクルのみがリセットされます。


spaceless

HTMLタグ間の空白を削除します。 これには、タブ文字と改行が含まれます。

使用例:

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

この例では、次のHTMLが返されます。

<p><a href="foo/">Foo</a></p>

タグ間のスペースのみが削除され、タグとテキスト間のスペースは削除されません。 この例では、Helloの周囲のスペースは削除されません。

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

templatetag

テンプレートタグの作成に使用される構文文字の1つを出力します。

テンプレートシステムには「エスケープ」の概念がないため、テンプレートタグで使用されているビットの1つを表示するには、{% templatetag %}タグを使用する必要があります。

引数は、出力するテンプレートビットを示します。

口論 出力
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

使用例:

{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

url

指定されたビューとオプションのパラメーターに一致する絶対パス参照(ドメイン名のないURL)を返します。 結果のパスの特殊文字は、 iri_to_uri()を使用してエンコードされます。

これは、テンプレートにURLをハードコーディングすることにより、DRYの原則に違反せずにリンクを出力する方法です。

{% url 'some-url-name' v1 v2 %}

最初の引数は URLパターン名です。 引用符で囲まれたリテラルまたはその他のコンテキスト変数にすることができます。 追加の引数はオプションであり、URLの引数として使用されるスペースで区切られた値である必要があります。 上記の例は、位置引数の受け渡しを示しています。 または、キーワード構文を使用することもできます。

{% url 'some-url-name' arg1=v1 arg2=v2 %}

1回の呼び出しで位置構文とキーワード構文の両方を混在させないでください。 URLconfに必要なすべての引数が存在する必要があります。

たとえば、URLconfがクライアントIDを受け取るビューapp_views.clientがあるとします(ここで、client()はビューファイルapp_views.py内のメソッドです)。 URLconf行は次のようになります。

path('client/<int:id>/', app_views.client, name='app-views-client')

このアプリのURLconfが次のようなパスでプロジェクトのURLconfに含まれている場合:

path('clients/', include('project_name.app_name.urls'))

…次に、テンプレートで、次のようにこのビューへのリンクを作成できます。

{% url 'app-views-client' client.id %}

テンプレートタグは、文字列/clients/client/123/を出力します。

反転するURLが存在しない場合は、 NoReverseMatch 例外が発生し、サイトにエラーページが表示されることに注意してください。

表示せずにURLを取得する場合は、少し異なる呼び出しを使用できます。

{% url 'some-url-name' arg arg2 as the_url %}

<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>

as var構文によって作成される変数のスコープは、{% url %}タグが表示される{% block %}です。

この{% url ... as var %}構文では、ビューが欠落している場合、 not でエラーが発生します。 実際には、これを使用して、オプションのビューにリンクします。

{% url 'some-url-name' as the_url %}
{% if the_url %}
  <a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}

名前空間付きURLを取得する場合は、完全修飾名を指定します。

{% url 'myapp:view-name' %}

これは、現在のアプリケーションに関してコンテキストによって提供されるヒントの使用を含め、通常の名前空間URL解決戦略に従います。

警告

URLパターンnameを引用符で囲むことを忘れないでください。そうしないと、値がコンテキスト変数として解釈されます。


verbatim

テンプレートエンジンがこのブロックタグのコンテンツをレンダリングしないようにします。

一般的な使用法は、Djangoの構文と衝突するJavaScriptテンプレートレイヤーを許可することです。 例えば:

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

特定の終了タグを指定して、レンダリングされていないコンテンツの一部として{% endverbatim %}を使用できるようにすることもできます。

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

widthratio

棒グラフなどを作成する場合、このタグは、指定された値と最大値の比率を計算し、その比率を定数に適用します。

例えば:

<img src="bar.png" alt="Bar"
     height="10" width="{% widthratio this_value max_value max_width %}">

this_valueが175、max_valueが200、max_widthが100の場合、上記の例の画像の幅は88ピクセルになります(175/200 = .875;であるため)。 875 * 100 = 87.5、これは88に切り上げられます)。

場合によっては、widthratioの結果を変数にキャプチャしたいことがあります。 たとえば、次のような:ttag: `blocktranslate` で役立ちます。

{% widthratio this_value max_value max_width as width %}
{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}

with

複雑な変数をより単純な名前でキャッシュします。 これは、「高価な」メソッド(データベースにアクセスするメソッドなど)に複数回アクセスする場合に役立ちます。

例えば:

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

入力された変数(上記の例では、total)は、{% with %}タグと{% endwith %}タグの間でのみ使用できます。

複数のコンテキスト変数を割り当てることができます。

{% with alpha=1 beta=2 %}
    ...
{% endwith %}

ノート

以前のより詳細な形式は引き続きサポートされます:{% with business.employees.count as total %}


内蔵フィルターリファレンス

add

引数を値に追加します。

例えば:

{{ value|add:"2" }}

value4の場合、出力は6になります。

このフィルターは、最初に両方の値を整数に強制しようとします。 これが失敗した場合は、とにかく値を合計しようとします。 これは、一部のデータ型(文字列、リストなど)で機能し、他のデータ型では失敗します。 失敗した場合、結果は空の文字列になります。

たとえば、次のような場合です。

{{ first|add:second }}

first[1, 2, 3]second[4, 5, 6]の場合、出力は[1, 2, 3, 4, 5, 6]になります。

警告

整数に強制変換できる文字列は、上記の最初の例のように、連結されずに合計になります。


addslashes

引用符の前にスラッシュを追加します。 たとえば、CSVで文字列をエスケープする場合に便利です。

例えば:

{{ value|addslashes }}

value"I'm using Django"の場合、出力は"I\'m using Django"になります。


capfirst

値の最初の文字を大文字にします。 最初の文字が文字でない場合、このフィルターは効果がありません。

例えば:

{{ value|capfirst }}

value"django"の場合、出力は"Django"になります。


center

指定された幅のフィールドの中央に値を配置します。

例えば:

"{{ value|center:"15" }}"

value"Django"の場合、出力は"     Django    "になります。


cut

指定された文字列からargのすべての値を削除します。

例えば:

{{ value|cut:" " }}

value"String with spaces"の場合、出力は"Stringwithspaces"になります。


date

指定された形式に従って日付をフォーマットします。

PHPの date()関数と同様の形式を使用しますが、いくつかの違いがあります。

ノート

これらのフォーマット文字は、テンプレート以外のDjangoでは使用されません。 これらは、設計者の移行を容易にするためにPHPと互換性があるように設計されています。


使用可能なフォーマット文字列:

文字をフォーマットする 説明 出力例
d 月の日、先行ゼロ付きの2桁。 '01'から'31'
j 先行ゼロのない月の日。 '1'から'31'
D 曜日、テキスト、3文字。 'Fri'
l 曜日、テキスト、長い。 'Friday'
S 月の日の英語の序数接尾辞、2文字。 'st''nd''rd'、または'th'
w 曜日、先行ゼロのない数字。 '0'(日曜日)から'6'(土曜日)
z 年間最優秀日。 1から366
W ISO-8601の週数で、週は月曜日から始まります。 153
m 月、先行ゼロ付きの2桁。 '01'から'12'
n 先行ゼロのない月。 '1'から'12'
M 月、テキスト、3文字。 'Jan'
b 月、テキスト、3文字、小文字。 'jan'
E 月、ロケール固有の代替表現。通常、長い日付の表現に使用されます。 'listopada''Listopad'ではなく、ポーランド語ロケールの場合)
F 月、テキスト、長い。 'January'
N AP通信スタイルの月の略語。 独自の拡張。 'Jan.''Feb.''March''May'
t 特定の月の日数。 28から31
y 年、先行ゼロ付きの2桁。 '00'から'99'
Y 年、4桁。 '1999'
L うるう年かどうかのブール値。 TrueまたはFalse
o うるう週を使用するISO-8601週番号(W)に対応するISO-8601週番号年。 より一般的な年の形式については、Yを参照してください。 '1999'
時間
g 先行ゼロのない時間、12時間形式。 '1'から'12'
G 先行ゼロのない時間、24時間形式。 '0'から'23'
h 時間、12時間形式。 '01'から'12'
H 時間、24時間形式。 '00'から'23'
i 分。 '00'から'59'
s 秒、先行ゼロ付きの2桁。 '00'から'59'
u マイクロ秒。 000000から999999
a 'a.m.'または'p.m.'(AP通信のスタイルに一致するピリオドが含まれているため、これはPHPの出力とは少し異なることに注意してください。) 'a.m.'
A 'AM'または'PM' 'AM'
f 時間(12時間時間と分)。ゼロの場合は分が省略されます。 独自の拡張。 '1''1:30'
P 時間、12時間制、分、および「am」/「pm」。ゼロの場合は分が省略され、必要に応じて特殊なケースの文字列「midnight」および「noon」が省略されます。 独自の拡張。 '1 a.m.''1:30 p.m.''midnight''noon''12:30 p.m.'
タイムゾーン
e タイムゾーン名。 日時に応じて、任意の形式にすることも、空の文字列を返すこともできます。 'GMT''-500''US/Eastern'など。
I 有効かどうかに関係なく、夏時間。 '1'または'0'
O 時間単位のグリニッジ標準時との違い。 '+0200'
T このマシンのタイムゾーン。 'EST''MDT'
Z 秒単位のタイムゾーンオフセット。 UTCの西のタイムゾーンのオフセットは常に負であり、UTCの東のタイムゾーンのオフセットは常に正です。 -43200から43200
日付時刻
c ISO8601形式。 (注:「Z」、「O」、「r」などの他のフォーマッターとは異なり、「c」フォーマッターは、値がナイーブな日時の場合、タイムゾーンオフセットを追加しません(datetime.tzinfoを参照)。 2008-01-02T10:30:00.000123+02:00、または日時がナイーブな場合は2008-01-02T10:30:00.000123
r RFC 5322 形式の日付。 'Thu, 21 Dec 2000 16:01:07 +0200'
U Unixエポックからの秒数(1970年1月1日00:00:00 UTC)。

例えば:

{{ value|date:"D d M Y" }}

valuedatetimeオブジェクトの場合(たとえば、datetime.datetime.now()の結果)、出力は文字列'Wed 09 Jan 2008'になります。

渡される形式は、事前定義された形式:setting: `DATE_FORMAT`:setting:` DATETIME_FORMAT`:setting: `SHORT_DATE_FORMAT` または[ X163X]:setting: `SHORT_DATETIME_FORMAT` 、または上記の表に示されているフォーマット指定子を使用するカスタムフォーマット。 事前定義された形式は、現在のロケールによって異なる場合があることに注意してください。

:setting: `USE_L10N`Trueであり、:setting:` LANGUAGE_CODE` がたとえば"es"であるとすると、次のようになります。

{{ value|date:"SHORT_DATE_FORMAT" }}

出力は文字列"09/01/2008"になります(Djangoに同梱されているesロケールの"SHORT_DATE_FORMAT"形式指定子は"d/m/Y"です)。

フォーマット文字列なしで使用する場合、DATE_FORMATフォーマット指定子が使用されます。 前の例と同じ設定を想定します。

{{ value|date }}

9 de Enero de 2008を出力します(esロケールのDATE_FORMATフォーマット指定子はr'j \d\e F \d\e Y'です)。 「d」と「e」はどちらも円記号でエスケープされています。それ以外の場合は、それぞれが曜日とタイムゾーン名をそれぞれ表示するフォーマット文字列であるためです。

date:tfilter: `time` フィルターと組み合わせて、datetime値の完全な表現をレンダリングできます。 例えば:

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

default

値がFalseと評価される場合、指定されたデフォルトを使用します。 それ以外の場合は、値を使用します。

例えば:

{{ value|default:"nothing" }}

value""(空の文字列)の場合、出力はnothingになります。


default_if_none

値がNoneの場合(およびその場合のみ)、指定されたデフォルトを使用します。 それ以外の場合は、値を使用します。

空の文字列が指定された場合、デフォルト値はではなく使用されることに注意してください。 空の文字列をフォールバックする場合は、:tfilter: `default` フィルターを使用します。

例えば:

{{ value|default_if_none:"nothing" }}

valueNoneの場合、出力はnothingになります。


dictsort

辞書のリストを取得し、引数で指定されたキーでソートされたリストを返します。

例えば:

{{ value|dictsort:"name" }}

valueが次の場合:

[
    {'name': 'zed', 'age': 19},
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
]

その場合、出力は次のようになります。

[
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
    {'name': 'zed', 'age': 19},
]

次のようなより複雑なこともできます。

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

booksが次の場合:

[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

その場合、出力は次のようになります。

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

dictsortは、リスト(または__getitem__()を実装する他のオブジェクト)のリストを、指定されたインデックスの要素ごとに並べ替えることもできます。 例えば:

{{ value|dictsort:0 }}

valueが次の場合:

[
    ('a', '42'),
    ('c', 'string'),
    ('b', 'foo'),
]

その場合、出力は次のようになります。

[
    ('a', '42'),
    ('b', 'foo'),
    ('c', 'string'),
]

インデックスは文字列ではなく整数として渡す必要があります。 以下は空の出力を生成します。

{{ values|dictsort:"0" }}

dictsortreversed

辞書のリストを取得し、引数で指定されたキーによって逆の順序でソートされたリストを返します。 これは上記のフィルターとまったく同じように機能しますが、戻り値は逆の順序になります。


divisibleby

値が引数で割り切れる場合は、Trueを返します。

例えば:

{{ value|divisibleby:"3" }}

value21の場合、出力はTrueになります。


escape

文字列のHTMLをエスケープします。 具体的には、次のように置き換えます。

  • <&lt;に変換されます
  • >&gt;に変換されます
  • '(一重引用符)は&#x27;に変換されます
  • "(二重引用符)は&quot;に変換されます
  • &&amp;に変換されます

通常は自動エスケープが結果に適用される変数にescapeを適用すると、1ラウンドのエスケープのみが実行されます。 したがって、自動エスケープ環境でもこの機能を使用しても安全です。 複数のエスケープパスを適用する場合は、:tfilter: `force_escape` フィルターを使用します。

たとえば、:ttag: `autoescape` がオフの場合、フィールドにescapeを適用できます。

{% autoescape off %}
    {{ title|escape }}
{% endautoescape %}

escapejs

JavaScript文字列で使用するために文字をエスケープします。 これは、文字列をHTMLまたはJavaScriptテンプレートリテラルで安全に使用できるようにするではありませんが、テンプレートを使用してJavaScript / JSONを生成するときの構文エラーから保護します。

例えば:

{{ value|escapejs }}

value"testing\r\njavascript 'string\" <b>escaping</b>"の場合、出力は"testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E"になります。


filesizeformat

「人間が読める」ファイルサイズのように値をフォーマットします(つまり、 '13 KB''4.1 MB''102 bytes'など)。

例えば:

{{ value|filesizeformat }}

valueが123456789の場合、出力は117.7 MBになります。

ファイルサイズとSI単位

厳密に言えば、filesizeformatは、KiB、MiB、GiBなどの使用を推奨する国際単位系に準拠していません。 バイトサイズが1024の累乗で計算される場合(これはここに当てはまります)。 代わりに、Djangoは、より一般的に使用される名前に対応する従来のユニット名(KB、MB、GBなど)を使用します。


first

リストの最初のアイテムを返します。

例えば:

{{ value|first }}

valueがリスト['a', 'b', 'c']の場合、出力は'a'になります。


floatformat

引数なしで使用すると、浮動小数点数を小数点以下1桁に丸めますが、表示する小数部分がある場合に限ります。 例えば:

value レンプレート 出力
34.23234 テンプレート:Value 34.2
34.00000 テンプレート:Value 34
34.26000 テンプレート:Value 34.3

数値の整数引数とともに使用する場合、floatformatは数値を小数点以下の桁数に丸めます。 例えば:

value レンプレート 出力
34.23234 テンプレート:Value 34.232
34.00000 テンプレート:Value 34.000
34.26000 テンプレート:Value 34.260

特に有用なのは、floatを最も近い整数に丸める引数として0(ゼロ)を渡すことです。

value レンプレート 出力
34.23234 テンプレート:Value 34
34.00000 テンプレート:Value 34
39.56000 テンプレート:Value 40

floatformatに渡された引数が負の場合、数値は小数点以下の桁数に丸められますが、表示する小数部分がある場合に限ります。 例えば:

value レンプレート 出力
34.23234 テンプレート:Value 34.232
34.00000 テンプレート:Value 34
34.26000 テンプレート:Value 34.260

floatformatに渡される引数にgサフィックスが付いている場合、アクティブなロケールの:setting: `THOUSAND_SEPARATOR` によるグループ化が強制されます。 たとえば、アクティブなロケールがen(英語)の場合:

value レンプレート 出力
34232.34 テンプレート:Value 34,232.34
34232.06 テンプレート:Value 34,232.1
34232.00 テンプレート:Value 34,232

引数なしでfloatformatを使用することは、-1の引数でfloatformatを使用することと同じです。

バージョン3.1での変更:古いバージョンでは、ゼロに丸められる負の数に対して負のゼロ-0が返されていました。


バージョン3.2で変更:千個の区切り文字でグループ化を強制するgサフィックスが追加されました。


force_escape

HTMLエスケープを文字列に適用します(詳細については、:tfilter: `escape` フィルターを参照してください)。 このフィルターはすぐに適用され、新しいエスケープ文字列を返します。 これは、複数のエスケープが必要な場合や、エスケープされた結果に他のフィルターを適用したい場合に役立ちます。 通常は、:tfilter: `escape` フィルターを使用します。

たとえば、:tfilter: `linebreaks` フィルターによって作成された<p> HTML要素をキャッチする場合:

{% autoescape off %}
    {{ body|linebreaks|force_escape }}
{% endautoescape %}

get_digit

整数を指定すると、要求された桁を返します。ここで、1は右端の桁、2は右から2番目の桁などです。 無効な入力の元の値を返します(入力または引数が整数でない場合、または引数が1未満の場合)。 それ以外の場合、出力は常に整数です。

例えば:

{{ value|get_digit:"2" }}

value123456789の場合、出力は8になります。


iriencode

IRI(Internationalized Resource Identifier)をURLに含めるのに適した文字列に変換します。 これは、URLに非ASCII文字を含む文字列を使用しようとしている場合に必要です。

:tfilter: `urlencode` フィルターを既に通過した文字列に対して、このフィルターを使用しても安全です。

例えば:

{{ value|iriencode }}

value"?test=1&me=2"の場合、出力は"?test=1&amp;me=2"になります。


join

Pythonのstr.join(list)のように、リストを文字列で結合します

例えば:

{{ value|join:" // " }}

valueがリスト['a', 'b', 'c']の場合、出力は文字列"a // b // c"になります。


json_script

PythonオブジェクトをJSONとして安全に出力し、<script>タグでラップして、JavaScriptで使用できるようにします。

引数: <script>タグのHTML「id」。

例えば:

{{ value|json_script:"hello-data" }}

valueが辞書{'hello': 'world'}の場合、出力は次のようになります。

<script id="hello-data" type="application/json">{"hello": "world"}</script>

結果のデータは、次のようにJavaScriptでアクセスできます。

const value = JSON.parse(document.getElementById('hello-data').textContent);

XSS攻撃は、文字「」、および「&」をエスケープすることで軽減されます。 たとえば、value{'hello': 'world</script>&amp;'}の場合、出力は次のようになります。

<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>

これは、ページ内スクリプトの実行を禁止する厳格なコンテンツセキュリティポリシーと互換性があります。 また、パッシブデータと実行可能コードを明確に分離します。


last

リストの最後のアイテムを返します。

例えば:

{{ value|last }}

valueがリスト['a', 'b', 'c', 'd']の場合、出力は文字列"d"になります。


length

値の長さを返します。 これは、文字列とリストの両方で機能します。

例えば:

{{ value|length }}

value['a', 'b', 'c', 'd']または"abcd"の場合、出力は4になります。

フィルタは、未定義の変数に対して0を返します。


length_is

値の長さが引数の場合はTrueを返し、それ以外の場合はFalseを返します。

例えば:

{{ value|length_is:"4" }}

value['a', 'b', 'c', 'd']または"abcd"の場合、出力はTrueになります。


linebreaks

プレーンテキストの改行を適切なHTMLに置き換えます。 単一の改行はHTML改行(<br>)になり、空白行が続く新しい行は段落区切り(</p>)になります。

例えば:

{{ value|linebreaks }}

valueJoel\nis a slugの場合、出力は<p>Joel<br>is a slug</p>になります。


linebreaksbr

プレーンテキスト内のすべての改行をHTML改行(<br>)に変換します。

例えば:

{{ value|linebreaksbr }}

valueJoel\nis a slugの場合、出力はJoel<br>is a slugになります。


linenumbers

行番号付きのテキストを表示します。

例えば:

{{ value|linenumbers }}

valueが次の場合:

one
two
three

出力は次のようになります。

1. one
2. two
3. three

ljust

指定された幅のフィールドの値を左揃えにします。

引数:フィールドサイズ

例えば:

"{{ value|ljust:"10" }}"

valueDjangoの場合、出力は"Django    "になります。


lower

文字列をすべて小文字に変換します。

例えば:

{{ value|lower }}

valueTotally LOVING this Album!の場合、出力はtotally loving this album!になります。


make_list

リストに変換された値を返します。 文字列の場合、それは文字のリストです。 整数の場合、引数はリストを作成する前に文字列にキャストされます。

例えば:

{{ value|make_list }}

valueが文字列"Joel"の場合、出力はリスト['J', 'o', 'e', 'l']になります。 value123の場合、出力はリスト['1', '2', '3']になります。


phone2numeric

電話番号(文字を含む可能性があります)を同等の数値に変換します。

入力は有効な電話番号である必要はありません。 これにより、任意の文字列が問題なく変換されます。

例えば:

{{ value|phone2numeric }}

value800-COLLECTの場合、出力は800-2655328になります。


pluralize

値が1'1'、または長さ1のオブジェクトでない場合は、複数形のサフィックスを返します。 デフォルトでは、このサフィックスは's'です。

例:

You have {{ num_messages }} message{{ num_messages|pluralize }}.

num_messages1の場合、出力はYou have 1 message.になります。num_messages2の場合、出力はYou have 2 messages.になります。

's'以外のサフィックスが必要な単語の場合、フィルターのパラメーターとして代替サフィックスを指定できます。

例:

You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

単純な接尾辞で複数形にならない単語の場合、単数形と複数形の両方の接尾辞をコンマで区切って指定できます。

例:

You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.

ノート

:ttag: `blocktranslate` を使用して、翻訳された文字列を複数形にします。


pprint

pprint.pprint()のラッパー–実際にはデバッグ用です。


random

指定されたリストからランダムなアイテムを返します。

例えば:

{{ value|random }}

valueがリスト['a', 'b', 'c', 'd']の場合、出力は"b"になります。


rjust

指定された幅のフィールドの値を右揃えにします。

引数:フィールドサイズ

例えば:

"{{ value|rjust:"10" }}"

valueDjangoの場合、出力は"    Django"になります。


safe

出力前にHTMLをエスケープする必要がないことを文字列にマークします。 自動エスケープがオフの場合、このフィルターは効果がありません。

ノート

フィルタをチェーンしている場合、safeの後に適用されたフィルタにより、コンテンツが再び安全でなくなる可能性があります。 たとえば、次のコードは、変数をエスケープせずにそのまま出力します。

{{ var|safe|escape }}

safeseq

:tfilter: `safe` フィルターをシーケンスの各要素に適用します。 :tfilter: `join` などのシーケンスを操作する他のフィルターと組み合わせて使用すると便利です。 例えば:

{{ some_list|safeseq|join:", " }}

この場合、:tfilter: `safe` フィルターを直接使用することはできません。これは、シーケンスの個々の要素を操作するのではなく、最初に変数を文字列に変換するためです。


slice

リストのスライスを返します。

Pythonのリストスライシングと同じ構文を使用します。 紹介については、 https://diveinto.org/python3/native-datatypes.html#slicinglistsを参照してください。

例:

{{ some_list|slice:":2" }}

some_list['a', 'b', 'c']の場合、出力は['a', 'b']になります。


slugify

ASCIIに変換します。 スペースをハイフンに変換します。 英数字、アンダースコア、またはハイフンではない文字を削除します。 小文字に変換します。 また、先頭と末尾の空白を削除します。

例えば:

{{ value|slugify }}

value"Joel is a slug"の場合、出力は"joel-is-a-slug"になります。


stringformat

文字列フォーマット指定子である引数に従って変数をフォーマットします。 この指定子は、先頭の「%」が削除されることを除いて、 old-string-formatting 構文を使用します。

例えば:

{{ value|stringformat:"E" }}

value10の場合、出力は1.000000E+01になります。


striptags

すべての[X] HTMLタグを削除するために可能な限りの努力をします。

例えば:

{{ value|striptags }}

value"<b>Joel</b> <button>is</button> a <span>slug</span>"の場合、出力は"Joel is a slug"になります。

安全保証なし

striptagsは、特に無効なHTML入力の場合、その出力がHTMLセーフであることを保証するものではないことに注意してください。 したがって、 NEVERsafeフィルターをstriptags出力に適用します。 より堅牢なものをお探しの場合は、bleach Pythonライブラリ、特に clean メソッドを使用できます。


time

指定された形式に従って時間をフォーマットします。

指定された形式は、事前定義された形式:setting: `TIME_FORMAT` 、または:tfilter:` date` フィルターと同じカスタム形式にすることができます。 事前定義された形式はロケールに依存することに注意してください。

例えば:

{{ value|time:"H:i" }}

valuedatetime.datetime.now()と同等の場合、出力は文字列"01:23"になります。

「raw」値を使用する場合は、フォーマット文字列をバックスラッシュエスケープできることに注意してください。 この例では、「h」と「m」の両方が円記号でエスケープされています。それ以外の場合、それぞれが時間と月をそれぞれ表示するフォーマット文字列であるためです。

{% value|time:"H\h i\m" %}

これは「01h23m」と表示されます。

もう一つの例:

:setting: `USE_L10N`Trueであり、:setting:` LANGUAGE_CODE` がたとえば"de"であるとすると、次のようになります。

{{ value|time:"TIME_FORMAT" }}

出力は文字列"01:23"になります(Djangoに同梱されているdeロケールの"TIME_FORMAT"形式指定子は"H:i"です)。

timeフィルターは、日付ではなく、時刻に関連するフォーマット文字列のパラメーターのみを受け入れます。 date値をフォーマットする必要がある場合は、代わりに:tfilter: `date` フィルターを使用します(または、必要に応じて:tfilter:` time` と一緒に使用します)。完全なdatetime値をレンダリングします)。

上記のルールには例外が1つあります。タイムゾーン情報が添付されたdatetime値(タイムゾーン対応 datetimeインスタンス)が渡されると、timeフィルタは、タイムゾーン関連のフォーマット指定子 'e''O''T'、および'Z'を受け入れます。

フォーマット文字列なしで使用される場合、TIME_FORMATフォーマット指定子が使用されます。

{{ value|time }}

と同じです:

{{ value|time:"TIME_FORMAT" }}

timesince

日付をその日付からの時間としてフォーマットします(例:「4日、6時間」)。

比較ポイントとして使用する日付を含む変数であるオプションの引数を取ります(引数がない場合、比較ポイントは now です)。 たとえば、blog_dateが2006年6月1日の深夜を表す日付インスタンスであり、comment_dateが2006年6月1日の08:00の日付インスタンスである場合、次のように「8時間」が返されます。 :

{{ blog_date|timesince:comment_date }}

オフセットなしの日時とオフセット対応の日時を比較すると、空の文字列が返されます。

分は使用される最小単位であり、「0分」は、比較ポイントに対して将来の日付に対して返されます。


timeuntil

timesinceと同様ですが、現在から指定された日付または日時までの時間を測定する点が異なります。 たとえば、今日が2006年6月1日で、conference_dateが2006年6月29日を保持する日付インスタンスである場合、テンプレート:Conference dateは「4週間」を返します。

now の代わりに)比較ポイントとして使用する日付を含む変数であるオプションの引数を取ります。 from_dateに2006年6月22日が含まれている場合、以下は「1週間」を返します。

{{ conference_date|timeuntil:from_date }}

オフセットなしの日時とオフセット対応の日時を比較すると、空の文字列が返されます。

分は使用される最小単位であり、比較ポイントに対して過去の日付については「0分」が返されます。


title

単語を大文字で開始し、残りの文字を小文字にすることで、文字列を大文字に変換します。 このタグは、「些細な単語」を小文字に保つ努力をしません。

例えば:

{{ value|title }}

value"my FIRST post"の場合、出力は"My First Post"になります。


truncatechars

指定された文字数より長い場合、文字列を切り捨てます。 切り捨てられた文字列は、翻訳可能な省略記号( "…")で終わります。

引数:切り捨てる文字数

例えば:

{{ value|truncatechars:7 }}

value"Joel is a slug"の場合、出力は"Joel i…"になります。


truncatechars_html

:tfilter: `truncatechars` と似ていますが、HTMLタグを認識する点が異なります。 文字列で開かれ、切り捨てポイントの前に閉じられていないタグは、切り捨ての直後に閉じられます。

例えば:

{{ value|truncatechars_html:7 }}

value"<p>Joel is a slug</p>"の場合、出力は"<p>Joel i…</p>"になります。

HTMLコンテンツの改行は保持されます。


truncatewords

特定の単語数の後の文字列を切り捨てます。

引数:切り捨てる単語の数

例えば:

{{ value|truncatewords:2 }}

value"Joel is a slug"の場合、出力は"Joel is …"になります。

文字列内の改行は削除されます。


truncatewords_html

:tfilter: `truncatewords` に似ていますが、HTMLタグを認識する点が異なります。 文字列で開かれ、切り捨てポイントの前に閉じられていないタグは、切り捨ての直後に閉じられます。

これは:tfilter: `truncatewords` よりも効率が悪いため、HTMLテキストが渡される場合にのみ使用する必要があります。

例えば:

{{ value|truncatewords_html:2 }}

value"<p>Joel is a slug</p>"の場合、出力は"<p>Joel is …</p>"になります。

HTMLコンテンツの改行は保持されます。


unordered_list

自己ネストされたリストを再帰的に取得し、HTMLの順序付けされていないリストを返します–開閉なし



upper

文字列をすべて大文字に変換します。

例えば:

{{ value|upper }}

value"Joel is a slug"の場合、出力は"JOEL IS A SLUG"になります。


urlencode

URLで使用する値をエスケープします。

例えば:

{{ value|urlencode }}

value"https://www.example.org/foo?a=b&c=d%22の場合、出力は"https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd"になります。

エスケープしてはならない文字を含むオプションの引数を指定できます。

指定しない場合、「/」文字は安全であると見なされます。 すべての文字をエスケープする必要がある場合は、空の文字列を指定できます。 例えば:

{{ value|urlencode:"" }}

value"https://www.example.org/%22の場合、出力は"https%3A%2F%2Fwww.example.org%2F"になります。


urlize

テキスト内のURLと電子メールアドレスをクリック可能なリンクに変換します。

このテンプレートタグは、プレフィックスがhttp://https://、またはwww.のリンクで機能します。 たとえば、https://goo.gl/aia1tは変換されますが、goo.gl/aia1tは変換されません。

また、元のトップレベルドメイン(.com.edu.gov.int.milのいずれかで終わるドメインのみのリンクもサポートしています。 ]、.net、および.org)。 たとえば、djangoproject.comは変換されます。

リンクには、末尾の句読点(ピリオド、コンマ、閉じる句読点)と先頭の句読点(開始句読点)を含めることができますが、urlizeは引き続き正しい動作をします。

urlizeによって生成されたリンクには、rel="nofollow"属性が追加されています。

例えば:

{{ value|urlize }}

value"Check out www.djangoproject.com"の場合、出力は"Check out <a href="http://www.djangoproject.com%22 rel="nofollow">www.djangoproject.com</a>"になります。

urlizeは、Webリンクに加えて、電子メールアドレスをmailto:リンクにも変換します。 value"Send questions to [email protected]"の場合、出力は"Send questions to <a href="mailto:[email protected]%22>[email protected]</a>"になります。

urlizeフィルターは、オプションのパラメーターautoescapeも取ります。 autoescapeTrueの場合、リンクテキストとURLは、Djangoの組み込みの:tfilter: `escape` フィルターを使用してエスケープされます。 autoescapeのデフォルト値はTrueです。

ノート

urlizeが既にHTMLマークアップを含むテキスト、または一重引用符を含む電子メールアドレス(')に適用されると、期待どおりに機能しません。 このフィルターはプレーンテキストにのみ適用してください。


urlizetrunc

URLとメールアドレスを urlize と同じようにクリック可能なリンクに変換しますが、指定された文字数制限より長いURLを切り捨てます。

引数:テキストをリンクする文字数。切り捨てが必要な場合に追加される省略記号も含まれます。

例えば:

{{ value|urlizetrunc:15 }}

value"Check out www.djangoproject.com"の場合、出力は'Check out <a href="http://www.djangoproject.com%22 rel="nofollow">www.djangoproj…</a>'になります。

urlize と同様に、このフィルターはプレーンテキストにのみ適用する必要があります。


wordcount

単語数を返します。

例えば:

{{ value|wordcount }}

value"Joel is a slug"の場合、出力は4になります。


wordwrap

指定された行の長さで単語をラップします。

引数:テキストを折り返す文字数

例えば:

{{ value|wordwrap:5 }}

valueJoel is a slugの場合、出力は次のようになります。

Joel
is a
slug

yesno

TrueFalse、および(オプションで)Noneの値を、文字列「yes」、「no」、「maybe」、またはとして渡されたカスタムマッピングにマップします。カンマ区切りのリストであり、値に応じてこれらの文字列の1つを返します。

例えば:

{{ value|yesno:"yeah,no,maybe" }}
価値 口論 出力
True yes
True "yeah,no,maybe" yeah
False "yeah,no,maybe" no
None "yeah,no,maybe" maybe
None "yeah,no" noNoneのマッピングが指定されていない場合、NoneFalseに変換します)


国際化タグとフィルター

Djangoは、テンプレート内の国際化の各側面を制御するためのテンプレートタグとフィルターを提供します。 これらは、翻訳、フォーマット、およびタイムゾーン変換のきめ細かい制御を可能にします。

i18n

このライブラリを使用すると、テンプレートで翻訳可能なテキストを指定できます。 有効にするには、:setting: `USE_I18N`Trueに設定してから、{% load i18n %}をロードします。

国際化:テンプレートコードを参照してください。


l10n

このライブラリは、テンプレート内の値のローカリゼーションを制御します。 {% load l10n %}を使用してライブラリをロードするだけで済みますが、多くの場合、:setting: `USE_L10N`Trueに設定して、ローカリゼーションがデフォルトでアクティブになるようにします。

テンプレートでのローカリゼーションの制御を参照してください。


tz

このライブラリは、テンプレートのタイムゾーン変換を制御します。 l10nと同様に、{% load tz %}を使用してライブラリをロードするだけで済みますが、通常は:setting: `USE_TZ`Trueに設定します。現地時間への変換はデフォルトで行われます。

テンプレートタイムゾーン対応の出力を参照してください。


その他のタグとフィルターライブラリ

Djangoには、他にもいくつかのテンプレートタグライブラリが付属しており、これらを明示的に有効にする必要があります。 :setting: `INSTALLED_APPS` テンプレートで設定して有効にする :ttag: `{%load%} ` 鬼ごっこ。

django.contrib.humanize

データに「人間味」を加えるのに役立つDjangoテンプレートフィルターのセット。 django.contrib.humanize を参照してください。


static

static

:setting: `STATIC_ROOT` に保存されている静的ファイルにリンクするには、Djangoには:ttag:` static` テンプレートタグが付属しています。 django.contrib.staticfiles アプリがインストールされている場合、タグは:setting: `STATICFILES_STORAGE` で指定されたストレージのurl()メソッドを使用してファイルを提供します。 例えば:

{% load static %}
<img src="{% static 'images/hi.jpg' %}" alt="Hi!">

また、標準のコンテキスト変数を使用することもできます。 user_stylesheet変数がテンプレートに渡されると仮定します。

{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen">

静的URLを表示せずに取得する場合は、少し異なる呼び出しを使用できます。

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}">

Jinja2テンプレートを使用していますか?

Jinja2でstaticタグを使用する方法については、 Jinja2 を参照してください。


get_static_prefix

:ttag: `static` テンプレートタグを使用することをお勧めしますが、:setting:` STATIC_URL` をテンプレートに挿入する場所と方法をより正確に制御する必要がある場合は、次のことができます。 :ttag: `get_static_prefix` テンプレートタグを使用します:

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!">

値が複数回必要な場合に余分な処理を回避するために使用できる2番目の形式もあります。

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!">

get_media_prefix

:ttag: `get_static_prefix` と同様に、get_media_prefixは、テンプレート変数にメディアプレフィックス:setting:` MEDIA_URL` を設定します。

{% load static %}
<body data-media-url="{% get_media_prefix %}">

値をデータ属性に格納することで、JavaScriptコンテキストで使用する場合に、値が適切にエスケープされるようにします。