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

このドキュメントでは、 Django の組み込みテンプレートタグとフィルタについて述べます。 また 自動ドキュメンテーション を使えばインストールされている組み込みタグとカスタムタグのドキュメントを読めるのでお勧めです。

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

autoescape

自動エスケープ機能を制御します。このタグは引数に on または off を取り、ブロック内の自動エスケープの有効・無効を決定します。ブロックの最後は endautoescape タグで閉じるようにします。

使用例:

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

自動エスケープがオンの場合、すべての変数由来の値を出力前に HTML エスケープします (他のフィルタはエスケープの前に適用されます)。この動作は、変数に escape フィルタを手動で適用した場合と同じです。

ただ一つの例外は、すでにエスケープに関して "safe" としてマークされている変数です。変数は、その変数に値を代入するコードによって safe フィルタや escape フィルタを適用されることで、 "safe" とマークされる可能性があります。

自動エスケープが無効であるスコープ内では、 escape を含むフィルタを連結すると、以下のような予期しない(しかしドキュメント化されている)結果を引き起こす可能性があります:

{% autoescape off %}
    {{ my_list|join:", "|escape }}
{% endautoescape %}

上記のコードは my_list の結合された要素をエスケープせずに出力します。これは、フィルタ連結シーケンスが最初に my_list に対して join を実行し (autoescapeoff のため、各項目をエスケープせずに)、その結果を safe としてマークするからです。その後、この safe な結果が escape フィルタに送られても2回目のエスケープはされません。

シーケンスのすべての要素を適切にエスケープするには escapeseq フィルタを使います:

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% 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 の防止のために使用します。詳細は クロスサイトリクエストフォージェリ (CSRF) を参照してください。.

cycle

タグを実行するごとに、引数の文字列や変数から、順に一つずつ値を出力します。最初の処理では 1 番目の値が、その次に 2 番目の値、以下、4 個まで同様に処理されます。サイクルのすべての値を出力すると、再び 1 番目に戻って出力します。

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

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

場合によっては、次の値に進まずにサイクルの現在の値を参照したいこともあるでしょう。これを行うには、 {% 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 %} はサイクルの初期設定を行うときサイクル内で使う値を初期化します。これは、入れ子となったループや include されたテンプレートで値を使う場合に問題になるかもしれません。もしあなたがサイクルを宣言したいだけで初期値を生成させたくない場合には、タグのキーワードの最後に silent を加えてください。以下に例を示します:

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

これは <tr> エレメントのリストを出力し、 class には row1row2 が交互に設定されます。サブテンプレートではそのコンテキスト内で rowcolors にアクセスし、値はそれを取り囲む <tr> のクラスに一致します。ここでもし silent キーワードが無かったら、 row1row2<tr> エレメントの外側で通常のテキストとして発行されます。

あるサイクルの定義において silent キーワードが使われているとき、後に続いて使われる cycle タグには自動的に silent が適用されます。次に示すテンプレートは、 2 番めの {% cycle %} 呼び出しでは silent を設定していませんが、何も出力しません。:

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

resetcycle タグを使うと、{% cycle %} タグが次に現れたときに最初の値から再スタートできます。

debug

現在のコンテキストやインポートモジュールを含むデバッグ情報を出力します。DEBUG 設定が False の場合、{% debug %} は何も出力しません。

Changed in Django 2.2.27:

古いバージョンでは DEBUG 設定が False の場合にデバッグ情報が表示されていました。

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 タグに囲まれたテキストは、すべて ブロックに含まれることに注意しましょう。

使用例:

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

注釈

escapesafe フィルタは引数として与えることができません。ブロックの自動エスケープを管理するには、代わりに autoescape タグを使ってください。

firstof

最初の引数変数が "false" でない(つまり、存在し、空でなく、False の真偽値でなく、0 の数値でない)場合、その変数を出力します。渡された変数がすべて "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 %} のように書くことで、出力を 1 つの変数内に格納することもできます。

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 入れ子のループであるとき、現在のループを囲んでいる 1 つ上のループを表します。

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>

上記の例は以下のテンプレートと同等です。しかし {% empty %} を使ったほうが簡潔で、かつ高速になる場合もあります。:

<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 %} タグは変数を評価し、その変数が "true" であるとき (すなわち変数が存在し、空ではなく、その値が False でないとき ) にブロックの内容を出力します:

{% 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|length }} 変数で表示します。

例にもあるように if タグはオプションで 1 個以上の {% elif %} 節、および 1 個の {% else %} 節をつけることができます。 {% else %} はそれまでの評価結果がすべて True でなかった場合に表示されるコンテンツを定義します。

論理演算子

if タグは and or 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 %}

andor は同じタグの中で同時に使用できます。このとき優先順位は and が優先します:

{% if athlete_list and coach_list or cheerleader_list %}

これは以下のように解釈されます:

if (athlete_list and coach_list) or cheerleader_list:
    ...

実際には if タグの中で丸括弧を使うことはできません。優先順位を示す必要がある場合には、if タグを入れ子にして表してください。

if タグは演算子 ==, !=, <, >, <=, >=, in, not in, is, and 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 演算子

オブジェクトの同一性。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 演算子

オブジェクトの非同一性。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 %}

フィルタ

if 内でフィルタを使うこともできます。例を示します:

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

複雑な表現

ここまでのすべてを組み合わせて複雑な式を作ることができます。このような式では、式を評価するときに演算子がどのようにグループ化されるか、すなわち優先順位の規則を理解することが重要です。演算子の優先順位は次のようになっています:

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

(この順序は Python とまったく同じです)。 そこで、例えば次に挙げる複雑な if タグの場合:

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

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

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

もしこれと違った優先順位が必要ならば、if タグを入れ子にして使う必要があります。優先順位の規則がはっきりしない場合には、こうした方がより明確な表現になることもあるでしょう。

比較演算子は Python や数学における記法のように、つないで書くことはできません。例えば次のような使い方はできません:

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

このように使うべきです:

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

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

テンプレートをロードし、現在のコンテキストを使って出力します。これはテンプレート内に他のテンプレートを取り込む( “include” )方法の一つです。

テンプレート名はハードコードされた (引用符で囲った) 文字列でもよく、引用符は一重引用符 ('...')でも二重引用符("...")でもかまいません。

次の例では、 "foo/bar.html" という名前のテンプレートの内容を include します:

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

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

次の例では、変数 template_name の値をテンプレート名として、そのテンプレートの内容を include します:

{% include template_name %}

変数は、コンテキストを受け取る render() メソッドを持っていればオブジェクトでも構いません。これによって、コンテキスト内のコンパイル済みの Template を参照できます。

さらに、この変数はテンプレート名のイテラブルにすることもできます。その場合、 select_template() に従って、ロードできる最初のものが使用されます。

include されたテンプレートは、include した側のコンテキストにおいて解釈されます。以下の例は "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 %}

注釈

include タグの実行は『サブテンプレートを出力し、その結果である HTML を取り込む』と考えるべきで、『サブテンプレートを解析し、親テンプレートの一部分として、そこに組み込まれている』かのように考えるべきではありません。これは、取り込んだテンプレートの間では状態を共有できず、まったく独立した過程で出力されることを意味します。

ブロックは取り込まれる 前に 評価されます。ブロックを含んでいる他のテンプレートを取り込む場合、そのブロックは すでに評価され、出力された結果 としてのブロックであり、たとえばテンプレートを継承したときのような、オーバーライド可能なブロックではありません。

load

カスタムのテンプレートタグセットを読み込みます。

例えば次のテンプレートは somelibrary 、そして package パッケージの otherlibrary に登録されたすべてのタグとフィルタを読み込みます。:

{% load somelibrary package.otherlibrary %}

引数に from を使えば、ライブラリからフィルタやタグを個別に選んで読み込むことができます。以下の例では、 foobar という名前のテンプレートタグまたはフィルタを somelibrary から読み込みます:

{% load foo bar from somelibrary %}

詳しくは カスタムタグとフィルタのライブラリ を参照してください。

lorem

ランダムな"lorem ipsum" のラテン語テキストを表示させます。テンプレート内でサンプルデータを用意するのに便利です。

使い方:

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

{% lorem %} タグは 0 から 3 個の引数をとります:

引数 説明
count 生成する単語または段落の数を指定する、数値または変数 (デフォルトは 1 ) 。
method w のとき単語を、p のとき HTML の段落ブロック、b のときプレーンテキストの段落ブロックを生成します ( デフォルトは b )。
random random が与えられたとき、一般的な文章 ( "Lorem ipsum dolor sit amet..." ) を使わずにテキストを生成します。

例:

  • {% lorem %} は、一般的な "lorem ipsum" を出力します。
  • {% lorem 3 p %} は一般的な "lorem ipsum" と 2 個のランダムな文章を、それぞれ HTML の <p> タグで括って出力します。
  • {% lorem 2 w random %} は 2 個のランダムなラテン単語を出力します。

now

指定したフォーマット文字列にしたがって現在の日付や時刻を表示します。フォーマット文字列で使われる文字については、 date フィルタの項で説明しています。

例:

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

文字列の中でフォーマット文字を普通の文字として扱いたい場合は、バックスラッシュ文字( \ )でエスケープします。次の例では、 "o" と "f" をエスケープしています。そうしなければ、これらはそれぞれ年と時刻を表示するためのフォーマット文字とみなされるからです:

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

この表示結果は "It is the 4th of September" となります。

注釈

フォーマットはプリセット( DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT )の中から 1 つを選ぶこともできます。 表示形式のローカライズ が有効なときは、プリセットフォーマットの内容は現在設定されているロケールによって変わります。たとえば、下記のようにします:

It is {% now "SHORT_DATETIME_FORMAT" %}

出力を (文字列として) 変数に入れる場合には {% now "Y" as current_year %} の書式が使えます。これは blocktranslate のようなテンプレートタグで {% now %} を使いたいときに役立ちます:

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

regroup

オブジェクトのリストから、同じ属性値を持つオブジェクトのグループを作ります。

この複雑なタグは例を通して説明するのがいいでしょう: cities"name", "population", and "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"},
]

...そして、あなたは次のように、国別に並べた一覧を表示させたいものとしましょう:

  • India
    • Mumbai: 19,000,000
    • Calcutta: 15,000,000
  • USA
    • New York: 20,000,000
    • Chicago: 7,000,000
  • Japan
    • Tokyo: 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 つの引数を取ります。グループ分けを行うリスト、グループ分けに使う属性の名前、そして結果とするリストの名前の 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 の順でソート済みだという前提です。citiescountry の順に並べられて いなかった 場合、regroup はそのまま何も考えずに 1 つの国に対してグループを 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 %} テンプレートコードは次のような結果を出力するでしょう:

  • India
    • Mumbai: 19,000,000
  • USA
    • New York: 20,000,000
  • India
    • Calcutta: 15,000,000
  • USA
    • Chicago: 7,000,000
  • Japan
    • Tokyo: 33,000,000

このような落し穴を解決するには、ビューコード内であらかじめデータを表示したい順番に並べておくのが最も簡単でしょう。

データが辞書のリストである場合には、もう一つの解決策として、テンプレートの中で dictsort フィルタを使ってデータを並べ変えることができます:

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

その他の属性によるグループ化

テンプレートの有効な参照は、いずれも regroup タグでグループ化するための属性として扱うことができます。これにはメソッド、属性、辞書のキー、リスト項目が含まれます。例えば "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

前の cycle をリセットし、次の遭遇時に最初の項目から再開するようにします。引数がない場合、 {% 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>Gareth</h1>
<p class="odd">Harry</p>
<p class="even">John</p>
<p class="odd">Nick</p>

<h1>John</h1>
<p class="odd">Andrea</p>
<p class="even">Melissa</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 %}

この例では、"odd" と "even" の交互の行と、5行目ごとの "major" な行の両方があります。カテゴリーが変わると、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

テンプレートタグの構文で使われる文字を、通常の文字として出力します。

テンプレートシステムには個々の文字を「エスケープ」する概念はありません。しかし、{% templatetag %} タグを使えば、テンプレートタグの文字の組み合わせを表示できます。

どの要素を出力するかは、引数で指定します:

引数 出力
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

使用例:

The {% templatetag openblock %} characters open a block.

これらの文字を含める別の方法については verbatim タグも参照してください。

url

ビューとオプションの引数を指定して、これとマッチする絶対パスへの参照 ( ドメイン部分を除いた URL ) を返します。結果のパスに特殊文字が含まれる場合、 iri_to_uri() を使ってエンコードされます。

これによって、テンプレート内での URL のハードコードによって DRY 原則に反することなくリンクを出力できます:

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

第 1 引数は URL パターン名 です。これは引用符で括ったリテラル、またはその他のコンテキスト変数です。続く引数はオプションで、空白で区切って指定します。引数はそれぞれ URL の引数として使われます。上の例では固定引数によって引数を指定していますが、代わりにキーワード引数で指定することもできます:

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

1 つの呼び出しのなかで、固定引数とキーワード引数を混ぜることはできません。また URLconf で必要とされる引数はすべて指定しなければなりません。

たとえば app_views.client という名前のビューがあって、クライアントの ID を引数に取るとしましょう ( client() は、 views ファイル app_views.py の中で定義されているメソッドです ) 。 URLconf は以下のようなものになるでしょう:

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

このアプリケーションの URLconf が、プロジェクトの URLconf の中に次のような形で include されていたとします:

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 変数`` の構文で作られた変数は、 {% url %} タグのある {% block %} 内がスコープとなります。

次の例で、 {% url ... as var %} 構文はビューが見つからなくてもエラーを起こしません。実用としては、オプションのビューへリンクする場合に使えます:

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

このブロックタグ内では、テンプレートエンジンによる解釈を行いません。

これは JavaScript テンプレート の文法が Django と衝突してしまう時によく使われます。例えば:

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

verbatim ブロックの中で "{% 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 であるとき、画像の幅は 88 ピクセルになります (175 / 200 = .875、 .875 * 100 = 87.5 から四捨五入して 88 )。

widthratio の結果を変数に入れてキャプチャーしたいことがあります。例えば 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" }}

value が 4 なら、出力は 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 }}

valuedjango のとき、出力は "Django" となります。

center

入力値を引数で指定された幅のフィールド内に中央寄せします。

例:

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

value の値が "django" のとき、出力は "     Django    " となります。

cut

入力値の中から、引数に指定した値を全て取り除きます。

例:

{{ value|cut:" " }}

value の値が "String with spaces" のとき、出力は "Stringwithspaces" となります。

date

引数に指定した書式で日付をフォーマットします。

PHP の date() 関数と似た書式を使いますが、若干の違いがあります。

注釈

これらのフォーマット文字は、テンプレート以外では使えません。デザイナーが PHP のテンプレートから容易に変換できるように互換性を持たせています。

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

フォーマット文字 説明 出力の例
   
d 日。 2 桁のゼロ詰め表示です。 '01''31'
j 日。ゼロ埋め表示なし。 '1''31'
D 曜日。 アルファベット 3 文字のテキスト形式です。 'Fri'
l 曜日。長いテキスト形式です。 'Friday'
S 日を表わす数字につける、英語特有の接尾辞。アルファベット 2 文字です。 'st', 'nd', 'rd' or 'th'
w 曜日(数字 1 桁)。 '0' (日曜) ~ '6' (土曜)
z 日(1年間における) 1366
   
W ISO-8601 による年間の週番号。 週は月曜日から始まります。 1, 53
   
m 月。数字 2 桁で、ゼロ埋め表示します。 '01''12'
n 月。ゼロ埋め表示しません。 '1''12'
M 月。アルファベット 3 文字のテキスト形式です。 'Jan'
b 月。アルファベット(小文字) 3 文字のテキスト形式です。 'jan'
E 月。ロケールが定義する代替表現が使われ、通常は長いテキスト形式になります。 'listopada' ( ロケールがポーランド語の場合。ポーランド語 'Listopad( 11 月)' の、時制における変化形 )
F 月。長いテキスト形式で表したものです。 'January'
N AP スタイルブックによる月の省略表記。独自の拡張です。 'Jan.', 'Feb.', 'March', 'May'
t その月の日数。 2831
   
y 年。数字 2 桁で、先頭をゼロ埋めします。 '00''99'
Y 年。数字 4 桁で、先頭をゼロ埋めします。 '0001', ..., '1999', ..., '9999'
L うるう年かどうかを表すブール値です。 True または False
o ISO-8601 の週番号付き記法による年。うるう週を用いた ISO-8601 週番号 (W) に対応します。一般的な年のフォーマットは 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 マイクロ秒。 000000999999
a 'a.m.' または 'p.m.' ( 注: PHP における出力と少し異なり、 AP スタイルブックに従ってピリオドをつけます ) 'a.m.'
A 'AM' または 'PM' 'AM'
f 時と分(12 時間表記)。ただしゼロ分であるときは時間だけを表示します。これは独自の拡張です。 '1''1:30'
P 時刻。12 時間表記による 時間:分 に続けて ‘a.m.’ または ’p.m.’ を表示します。ゼロ分である場合には分の表示が省略され、必要に応じて ‘midnight’ または ‘noon’ の表示になります。 独自の拡張です。 '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
タイムゾーン    
e タイムゾーン名。どのフォーマットでも使えますが、 datetime によっては空の文字列を返す場合もあります。 '', 'GMT', '-500', 'US/Eastern' など
I 夏時間(DST)が有効か、そうでないかを表します。 '1' または '0'
O グリニッジ標準時からの時差。 '+0200'
T 計算機のタイムゾーン設定。 'EST', 'MDT'
Z タイムゾーンオフセットを秒であらわしたもの。UTC よりも西側のタイムゾーン値は全て負の値になり、東側の値は常に正になります。 -4320043200
日付/時刻    
c ISO 8601 フォーマット。 ( 注: これは他の "Z"、"O"、"r" といったフォーマット文字とは異なり、 入力値がタイムゾーン情報を含まない("naive"な) datetime であっても、タイムゾーンによる時差を加算しません ( datetime.tzinfo を参照 )。 2008-01-02T10:30:00.000123+02:00 、または datetime が naive である場合 2008-01-02T10:30:00.000123
r RFC 5322 フォーマットの日付。 'Thu, 21 Dec 2000 16:01:07 +0200'
U Unix エポック時 ( UTC 協定世界時 1970年1月1日 00:00:00 ) からの秒数。  

例:

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

上の例で、値が datetime オブジェクトである場合 (たとえば datetime.datetime.now() の結果など)、出力は 'Wed 09 Jan 2008' となります。

フォーマットには、プリセット( DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT or SHORT_DATETIME_FORMAT )のうちの1つ、または上記の表で示したフォーマット指定文字を使ったカスタムフォーマットが使えます。プリセットのフォーマットは、現在のロケールに応じて表示が変化することに注意してください。

たとえば LANGUAGE_CODE"es" だったとして、:

{{ value|date:"SHORT_DATE_FORMAT" }}

上記の出力は、文字列 "09/01/2008" となります ( es ロケールの "SHORT_DATE_FORMAT" フォーマットは、 Django の初期設定では "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 "はどちらもバックスラッシュでエスケープされていますが、それ以外はそれぞれ曜日とタイムゾーン名を表示するフォーマット文字列だからです。

datetime フィルタを組み合わせることで、 datetime 値を完全に表示することもできます。 たとえば以下のようにします:

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

default

入力の評価値が False の場合、引数に指定したデフォルト値を使います。そうでなければ、入力値を使います。

例:

{{ value|default:"nothing" }}

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

default_if_none

入力値が None であるとき ( None であるときのみ ) 、引数に指定したデフォルト値を使いま す。そうでなければ、入力値を使います。

空の文字列が入力された場合は、デフォルト値を 使わない ことに注意してください。空文字列をフォールバックしたければ 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" }}

指定したインデックスの要素によるソートは辞書ではサポートされていません。

Changed in Django 2.2.26:

古いバージョンでは、指定したインデックスで要素をソートすることが辞書でサポートされていました。

dictsortreversed

辞書のリストを入力に取り、引数に指定したキーでリストを逆順にソートして返します。これは上のフィルタと全く同じ処理をしますが、返す値は逆順です。

divisibleby

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

例:

{{ value|divisibleby:"3" }}

value21 であるとき、出力は True です。

escape

入力文字中にある HTML の特殊文字をエスケープします。具体的には、以下のような置換を行います:

  • <&lt; に変換
  • >&gt; に変換
  • ' ( シングルクォート ) を &#x27; に変換
  • " ( ダブルクォート ) を &quot; に変換
  • &&amp; に変換

escape を変数に適用するとき、変数にはすでに自動エスケープが適用されているかもしれませんが、エスケープが二重に実行されることはありません。したがって自動エスケープ環境であっても、この機能は安全に使用できます。複数回のエスケープが適用されるようにしたい場合は force_escape フィルタを使用してください。

以下は autoescape がオフであるときに、フィールドに escape を適用する例です:

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

escape を他のフィルタと連結する場合

autoescape のセクションで述べたように、escape を含むフィルタが連結されている場合、 autoescapeoff であることが原因でエスケープが行われず、先行するフィルタが安全でない可能性のある文字列を安全であるとマークしてしまうと、予期しない結果になることがあります。

このような場合、escape を連結させても、すでに安全であるとマークされている文字列を再エスケープすることはできません。

これは、例えば join のようなシーケンスを操作するフィルタを使う場合に特に重要です。シーケンスの各要素をエスケープする必要がある場合は、専用の escapeseq フィルタを使用してください。

escapejs

JavaScript の文字列リテラル全体として、以下のように一重引用符または二重引用符で囲んで使用する文字をエスケープします。このフィルタは文字列を "JavaScript テンプレートリテラル " (JavaScript のバックティック構文) では安全に使えません。これ以外の使い方はサポートされていません。通常は、データは埋め込み JavaScript ではなく、HTMLの data- 属性や json_script フィルタを使って渡すことを推奨します。

例:

<script>
let myValue = '{{ value|escapejs }}'

escapeseq

New in Django 5.0.

シーケンスのそれぞれの要素に対して escape フィルタを適用します。これはたとえば join のような、シーケンスを処理する他のフィルタと組み合わせて使うのが便利です。例をあげます:

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% endautoescape %}

filesizeformat

入力値を、人間が読みやすいファイルサイズ表現 ('13 KB', '4.1 MB', '102 bytes' など) に変換します。

例:

{{ value|filesizeformat }}

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

ファイルサイズと国際単位系(SI)

filesizeformat は、厳密には国際単位系(SI)に準拠していません。国際単位系ではバイトサイズを 1024 の累乗で計算する場合 (上の例がそうですが) 、 KiB、MiB、GiB などの単位を使うよう推奨しています。しかし Django ではより一般的な表記に対応して、従来の単位名( KB、 MB、GB など)を使用しています。

first

リスト中の最初の要素を返します。

例:

{{ value|first }}

value がリスト ['a', 'b', 'c'] であるとき、出力は 'a' になります。

floatformat

引数なしで使った場合、浮動小数点数を小数点以下1桁に丸めます。ただし小数部分がない時には整数部分だけを表示します。例を示します:

value テンプレート 出力
34.23234 {{ value|floatformat }} 34.2
34.00000 {{ value|floatformat }} 34
34.26000 {{ value|floatformat }} 34.3

引数に1以上の整数を指定した場合、 floatformat は小数部分を指定された桁数で丸めます。以下に例を示します:

value テンプレート 出力
34.23234 {{ value|floatformat:3 }} 34.232
34.00000 {{ value|floatformat:3 }} 34.000
34.26000 {{ value|floatformat:3 }} 34.260

特に便利な使い方として、引数に 0 (ゼロ) を指定した場合、入力値を一番近い整数に丸めます。

value テンプレート 出力
34.23234 {{ value|floatformat:"0" }} 34
34.00000 {{ value|floatformat:"0" }} 34
39.56000 {{ value|floatformat:"0" }} 40

引数に負の数を指定した場合、小数部分を指定された桁数(指定された数の絶対値)で丸めます。ただし小数部分がない時には整数部分だけを表示します。例を示します:

value テンプレート 出力
34.23234 {{ value|floatformat:"-3" }} 34.232
34.00000 {{ value|floatformat:"-3" }} 34
34.26000 {{ value|floatformat:"-3" }} 34.260

もし floatformat に渡された引数の接尾辞が g の場合、アクティブなロケールの THOUSAND_SEPARATOR によるグループ化を強制します。例えば、アクティブなロケールが en (英語) の場合、以下のようになります:

value テンプレート 出力
34232.34 {{ value|floatformat:"2g" }} 34,232.34
34232.06 {{ value|floatformat:"g" }} 34,232.1
34232.00 {{ value|floatformat:"-3g" }} 34,232

{% localize off %} タグに関係なく)出力は常にローカライズされます。ただし、 floatformat に渡された引数の接尾辞が u であった場合は、ローカライズが無効になります。例えば、アクティブなロケールが pl (ポーランド語) の場合、以下のようになります:

value テンプレート 出力
34.23234 {{ value|floatformat:"3" }} 34,232
34.23234 {{ value|floatformat:"3u" }} 34.232

floatformat を引数なしで使用した場合の動作は、引数に -1 を指定した場合と同じです。

force_escape

文字列に HTML エスケープを適用します。 ( 詳しくは escape フィルタを参照してください )。フィルタは 即座に 適用され、新たなエスケープ済みの文字列を返します。このタグが有用となるケースは稀で、複数回のエスケープが必要な場合や、エスケープされた結果に対して他のフィルタを適用したい場合に使います。通常は escape フィルタを使うことになるでしょう。

例えば、 linebreaks フィルタによって作成された <p> HTML 要素をキャッチしたい場合、以下のようにします:

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

get_digit

入力値が整数であるとき、引数で指定された桁にある数字を返します。たとえば引数が 1 のとき右端の桁、 2 のとき右から 2 桁目が指定されます。入力が整数でない場合には、入力値をそのまま返します。

例:

{{ value|get_digit:"2" }}

value123456789 のとき、出力は 8 です。

iriencode

IRI (国際化リソース識別子 Internationalized Resource Identifier) を URL に適した文字列に変換します。これは非 ASCII 文字列を URL に埋め込む場合に必要なフィルタです。

urlencode フィルタを通した後の文字列を、このフィルタに通しても問題はありません。

例:

{{ value|iriencode }}

If value is "?test=I Django", the output will be "?test=I%20%E2%99%A5%20Django".

join

Python の str.join(list) と同じく、リストを文字列でつなぎます。

例:

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

value の値がリスト ['a', 'b', 'c'] であるとき、出力は文字列 "a // b // c" となります。

json_script

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

引数: オプションで、HTMLの <script> タグの "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

バージョン 4.2 で非推奨.

入力値の長さと引数が等しければ True を返し、そうでなければ False を返します。

例:

{{ value|length_is:"4" }}

value['a', 'b', 'c', 'd'] あるいは "abcd" であるとき、それぞれ出力は True です。

linebreaks

プレーンテキストの改行を適切な HTML タグに変換します。 改行 1 つは改行タグ (<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" }}.

注釈

飜訳された文字列を複数形に変換するときは blocktranslate を使ってください。

pprint

pprint.pprint() のラッパーです -– 実のところ、これはデバッグ用です。

random

与えられたリストからランダムな要素を返します。

例:

{{ value|random }}

value の値がリスト ['a', 'b', 'c', 'd'] であるとき、出力は "b" かもしれません。

rjust

入力値を指定した幅のフィールド内で右詰めします。

引数: フィールドの幅

例:

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

valueDjango であるとき、出力は "    Django" となります。

safe

文字列に対して、さらなる HTML エスケープが必要でないことをマークするのに使います。 autoescaping がオフの場合、このフィルタは何もしません。

注釈

フィルタを連鎖させる場合、 safe の後に適用されるフィルタはその内容を再び安全でない状態にしてしまうことが可能です。例えば以下のコードは、変数をそのまま、エスケープされない状態で出力します:

{{ var|safe|escape }}

safeseq

シーケンスのそれぞれの要素に対して safe フィルタを適用します。これは例えば join のような、シーケンスを処理する他のフィルタと組み合わせて使うのが便利です。例を挙げます:

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

この場合、直接 safe フィルタを使用すると正しく動作しないかもしれません。シーケンスの個々の要素に対して作用するのではなく、まず変数を文字列に変換して処理するからです。

slice

リストに対するスライスを返します。

Python のリストスライスと同じ構文を使います。 Python ドキュメント を参照してください。

例:

{{ 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

引数 (表示形式を指定する文字列) に応じて、変数の表示形式を変更します。指定方法には、printf-style 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 の安全性を一切保証しません。 striptags の出力に safe フィルタを適用しては いけません 。より堅牢なものを探しているなら、サードパーティ製の HTML サニタイズツールの使用を検討してください。

time

時刻を指定の書式にしたがってフォーマットします。

フォーマットは date と同様に、あらかじめ定義された TIME_FORMAT のプリセット、またはカスタムフォーマットを使うこともできます。この定義はロケールに依存することに注意してください。

例:

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

valuedatetime.datetime.now() の値であるとき、出力は "01:23" といった文字列になります。

文字列の中でフォーマット文字を普通の文字として扱いたい場合は、バックスラッシュ文字( \ )でエスケープします。次の例では、 "h" と "m" をエスケープしています。そうしないと、これらはそれぞれ年と時刻を表示するためのフォーマット文字とみなされるからです:

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

上記は "01h 23m" と表示されます。

その他の例:

たとえば LANGUAGE_CODE"de" だったとして、:

{{ value|time:"TIME_FORMAT" }}

このときの出力は、"01:23" といった文字列になります (初期状態の Django では、ロケール de"TIME_FORMAT" には "H:i" が定義されています) 。

time フィルタは日付ではなく、1 日における時刻に関連するパラメータのみをフォーマット文字列として受け付けます。日付 のフォーマットを行いたいときは、 date フィルタを使ってください ( datetime の値をすべて表示させたい場合は time と一緒に使います)。

上記のルールにはひとつ例外があります。タイムゾーン情報が付加された datetime 値 (タイムゾーンを意識した aware な datetime インスタンス) が渡された場合、time フィルターはタイムゾーン関連の フォーマット指定子 'e', 'O', 'T', 'Z' を受け付けます。

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

{{ value|time }}

上記は以下と同じです:

{{ value|time:"TIME_FORMAT" }}

timesince

日付を経過時間の形式にフォーマットします (たとえば "4 days, 6 hours")。

オプションの引数として、比較対象とする時刻をとります (引数を省略すると 現在時刻 を使います)。例えば、 blog_date が 2006年 6月 1日 を表す日付オブジェクトで、comment_date が 2006年 6月 1日 08:00 を表す日時オブジェクトであるとき、以下のコードは "8 hours" を返します:

{{ blog_date|timesince:comment_date }}

タイムゾーン情報を持たない値(offset-naive)と、タイムゾーン情報つき(offset-aware)の値とを比較した場合は、空の文字列を返します。

最小単位は "分" です。比較対象からみて未来にある日時に対しては "0 minutes" を返します。

timeuntil

timesince に似ていますが、現在時刻を起点として指定の日付または日時までの時刻を計算します。たとえば今日が2006年6月1日で conference_date が 2006年6月29日の値を保持する日付インスタンスだったとすれば、{{ conference_date|timeuntil }} は "4 weeks" を返します。

オプションの引数として、 (現在時刻 の代わりに) 比較対象として使う時刻をとります。 例えば、 from_date が 2006年 6月 22日 の場合、以下のコードは "1 week" を返します:

{{ conference_date|timeuntil:from_date }}

タイムゾーン情報を持たない値(offset-naive)と、タイムゾーン情報つき(offset-aware)の値とを比較した場合は、空の文字列を返します。

最小単位は "分" です。比較対象からみて過去にある日時に対しては “0 minutes” を返します。

title

文字列中の単語に対して、それぞれ先頭の文字を大文字に、残りを小文字にすることで文字列をタイトルケースに変換します。"主要でない単語" については小文字を維持できないこともあります。

例:

{{ value|title }}

value"my FIRST post" であるとき、出力は "My First Post" となります。

truncatechars

文字列が指定した文字数より長い場合は切り捨てます。切り捨てられた文字列の末尾は、翻訳可能な省略記号 ("...") になります。

引数: 切り詰める文字数

例:

{{ value|truncatechars:7 }}

value"Joel is a slug" であるとき、出力は "Joel i…" となります。

truncatechars_html

truncatechars に似ていますが、 HTML タグを認識します。切り詰めを行う時点で閉じていないタグがあれば、切り詰めた文字の直後に全て閉じます。

例:

{{ value|truncatechars_html:7 }}

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

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

入力文字列のサイズ

大きく、潜在的に不正なHTML文字列を処理することは、リソースを消費し、サービスのパフォーマンスに影響を与える可能性があります。 truncatechars_html は入力を最初の500万文字に制限します。

Changed in Django 3.2.22:

古いバージョンでは、500万文字以上の文字列も処理されていました。

truncatewords

文字列を指定された単語数以内に切り詰めます。

引数: 切り詰めた後の単語数

例:

{{ value|truncatewords:2 }}

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

文字列中の改行は取り除かれます。

truncatewords_html

truncatewords に似ていますが、 HTML タグを認識します。切り詰めを行う時点で閉じていないタグがあれば、切り詰めた文字の直後に全て閉じます。

このタグの処理は truncatewords よりも効率が悪いため、 HTML テキストを 渡す場合にだけ使うようにしてください。

例:

{{ value|truncatewords_html:2 }}

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

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

入力文字列のサイズ

大きく、潜在的に不正なHTML文字列を処理することは、リソースを消費し、サービスのパフォーマンスに影響を与える可能性があります。 truncatewords_html は入力を最初の500万文字に制限します。

Changed in Django 3.2.22:

古いバージョンでは、500万文字以上の文字列も処理されていました。

unordered_list

再帰的に入れ子になったリストを入力として、 HTML の順序なしリスト (UL, unordered list) に変換します。ただし先頭と末尾の <ul> タグは表示しません。

リストは適切な形式になっているものとみなします。例えば、var の内容が ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']] の場合、 {{ var|unordered_list }} は以下のようになります:

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>

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" のとき、出力は "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd" となります。

オプションの引数で、エスケープさせない文字を指定できます。

特に指定しなくても '/' の文字はエスケープされません。オプションで空の文字列が指定された場合は、すべての 文字がエスケープされます。例を挙げます:

{{ value|urlencode:"" }}

ここで value"https://www.example.org/" であるとき、出力は "https%3A%2F%2Fwww.example.org%2F" となります。

urlize

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

このテンプレートタグは 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" rel="nofollow">www.djangoproject.com</a>" となります。

ウェブリンクに加えて、 urlize は email アドレスも mailto: リンクに変換できます。value"Send questions to foo@example.com" であるとき、出力は "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>" となります。

urlize フィルタはオプションの引数 autoescape をとることができます。autoescapeTrue のとき、リンクテキストと URL は Django の組み込みフィルタ escape でエスケープされます。指定しない場合の autoescape の値は True です。

注釈

もし urlize をすでに HTML マークアップを含むテキストに適用したり、シングルクォート(')を含むメールアドレスに適用したりすると、期待通りに動作しません。このフィルタはプレーンテキストにだけ適用してください。

urlizetrunc

urlize と同じように、URL と email アドレスをクリック可能なリンクに変換します。ただし、指定の文字数以上の表示を切り詰めます。

引数: URL を切り詰める長さ。省略記号の長さを含みます。省略記号は省略が必要な場合につけられます。

例:

{{ value|urlizetrunc:15 }}

value"Check out www.djangoproject.com" であるとき、出力は 'Check out <a href="http://www.djangoproject.com" 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

入力値 ( "True" 、 "False" 、オプションで "None" ) に対応する文字列を返します。対応する文字列はデフォルトでは "yes"、"no"、"maybe" です。またコンマ区切りの文字列を引数として与えることでカスタムマッピングを指定できます。

例:

{{ 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" no (None に対応する値がない場合は False の値が使われます)

国際化タグとフィルタ

Django はテンプレートの 国際化 をそれぞれの角度から制御するタグやフィルタを提供し、翻訳、書式設定、およびタイムゾーン変換のきめ細かい制御を可能にしています。

i18n

このライブラリは、テンプレート内の飜訳可能なテキストを指定できます。これを有効化するには USE_I18NTrue に設定し、 {% load i18n %} でロードします。

国際化: テンプレート内 も参照してください。

l10n

このライブラリはテンプレート内の値のローカライズを制御します。このライブラリは {% load l10n %} を使って読み込むだけです。

テンプレート内でローカライズをコントロールする も参照してください。

tz

このライブラリは、テンプレートのタイムゾーン変換を制御します。 l10n と同じく、必要なのは {% load tz %} を使ってライブラリをロードするだけですが、通常はデフォルトでローカル時間に変換されるよう、 USE_TZTrue に設定するでしょう。

テンプレートでのタイムゾーン aware な出力 も参照してください。

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

この他にも、Django にはいくつかのテンプレートタグ・ライブラリがあります。これらのライブラリは INSTALLED_APPS 設定で明示的に有効化したうえ、 {% load %} タグを使ってテンプレート上にロードする必要があります。

django.contrib.humanize

データを「ヒトにやさしい」表現にする上で便利な Django テンプレートフィルタのセットです。くわしくは django.contrib.humanize を参照してください。

static

static

STATIC_ROOT に保存されている静的ファイルにリンクするために、 Django には static テンプレートタグが同梱されています。 django.contrib.staticfiles アプリケーションがインストールされていれば、このタグは STORAGESstaticfiles で指定されたストレージの url() メソッドを使ってファイルを配信します。たとえば以下のようにします:

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

普通のコンテキスト変数を使うこともできます。例えば user_stylesheet 変数をテンプレートに渡す場合は、以下のようにします:

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

静的 URL を表示することなく取得したい場合は、少し異なる呼び出し方法になります:

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

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

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

get_static_prefix

通常は static テンプレートタグの使用を推奨しますが、 STATIC_URL がテンプレートに挿入される場所と方法をより厳密に制御する必要がある場合は、 get_static_prefix テンプレートタグが使用できます:

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

値を何度も使う必要がある場合、不要な処理を避けるために使用できる別の方式もあります:

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

get_static_prefix と同じように、get_media_prefix はテンプレート変数に MEDIA_URL のメディア・プレフィックスを加えます。たとえば:

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

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

Back to Top