組み込みタグとフィルタ¶
このドキュメントでは、 Django の組み込みテンプレートタグとフィルタについて述べます。 また automatic documentation を使えばインストールされている組み込みタグとカスタムタグのドキュメントを読めるのでお勧めです。
組み込みタグリファレンス¶
autoescape
¶
自動エスケープ機能を制御します。このタグは引数に on
または off
を取り、ブロック内の自動エスケープの有効・無効を決定します。ブロックの最後は endautoescape
タグで閉じるようにします。
自動エスケープがオンの場合、すべての変数の値を出力前に HTML エスケープします (他のフィルタはエスケープの前に適用されます)。この動作は、変数に escape
フィルタを手動で適用した場合と同じです。
例外として、( safe
または escape
フィルタの適用、あるいはコードで変数を挿入することによって)すでに 「safe」 であるとマークされている変数にはエスケープされません。
使用例:
{% autoescape on %}
{{ body }}
{% endautoescape %}
block
¶
子テンプレートによってオーバーライドされる部分を定義します。詳しくは Template inheritance を参照してください。
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 の防止のために使用します。詳細は Cross Site Request Forgeries を参照してください。.
cycle
¶
タグを実行するごとに、引数の文字列や変数から、順に一つずつ値を出力します。最初の処理では 1 番目の値が、その次に 2 番目の値、以下、4 個まで同様に処理されます。サイクルのすべての値を出力すると、再び 1 番目に戻って出力します。
このタグは特にループ内で使うのが便利です:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
この例では、繰り返しの最初の実行では row1
クラスを参照する HTML が生成されます。 2 回目には row2
、 3 回目は再び row1
というように、ループを繰り返すたびに交互に処理されます。
変数を使うことも出来ます。例えば、ここに 2 つのテンプレート変数 rowvalue1
rowvalue2
があって、これらを交互に出力させたい場合には次のように書くことができます:
{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
cycle
に含まれる変数はエスケープされます。自動エスケープなしで出力する場合には次のようにします。
{% 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 %}
はサイクルの初期設定を行うときサイクル内で使う値を初期化します。これは、入れ子となったループや include されたテンプレートで値を使う場合に問題になるかもしれません。もしあなたがサイクルを宣言したいだけで初期値を生成させたくない場合には、タグのキーワードの最後に silent
を加えてください。以下に例を示します:
{% for obj in some_list %}
{% cycle 'row1' 'row2' as rowcolors silent %}
<tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}
これは <tr>
エレメントのリストを出力し、 class
には row1
と row2
が交互に設定されます。サブテンプレートではそのコンテキスト内で rowcolors
にアクセスし、値はそれを取り囲む <tr>
のクラスに一致します。ここでもし silent
キーワードが無かったら、 row1
と row2
は <tr>
エレメントの外側で通常のテキストとして発行されます。
あるサイクルの定義において silent キーワードが使われているとき、後に続いて使われる cycle タグには自動的に silent を適用します。次に示すテンプレートは、 2 番めの {% cycle %}
呼び出しでは silent
を設定していませんが、何も出力しません。
{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}
You can use the resetcycle
tag to make a {% cycle %}
tag restart
from its first value when it’s next encountered.
debug
¶
現在のコンテキストや import されたモジュールなどを含んだデバッグ情報ひと揃いを出力します。
extends
¶
このテンプレートが親テンプレートからの拡張であることを指示します。
このタグには 2 種類の使い方があります:
{% extends "base.html" %}
(引用符つき) の場合、リテラル値 「base.html」 を親テンプレートの名前として使います。{% extends variable %}
とした場合、変数variable
の値を親テンプレートの名前として使います。変数の値が文字列の場合、 Django はその文字列を親テンプレートの名前として使います。値がTemplate
オブジェクトの場合、Django はそのオブジェクトを親テンプレートにします。
詳しくは Template inheritance を参照してください。
Normally the template name is relative to the template loader’s root directory.
A string argument may also be a relative path starting with ./
or ../
.
For example, assume the following directory structure:
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 %}
注釈
escape
と safe
フィルタは引数として与えることができません。ブロックの自動エスケープを管理するには、代わりに autoescape
タグを使ってください。
firstof
¶
与えられた引数の中から False
でない最初の 1 つを出力します。すべて False
だった場合は何も出力しません。
使用例:
{% firstof var1 var2 var3 %}
これは以下のテンプレートと等価です:
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
すべての変数の値が False
だった場合に表示させるフォールバック値として、 1 個の文字列リテラルを指定できます:
{% 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) のリストを athlete_list
で渡して表示するには:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
{% for obj in list reversed %}
で、リストに対して逆順のループを実行できます。
リストのリストにわたってループ処理を行う場合、各サブリストをアンパックして、個別に名前を割り当てることができます。例えば、座標を表すリスト (x, y) を格納したリスト points
があるとき、その各座標を出力したい場合には以下のようにします:
{% 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.items
は data.items()
ではなく data['items']
の値を出力します。テンプレート内で辞書のメソッドを使いたい場合、そのような名前のキー (items
、values
、keys
など) を辞書に追加しないでください。ドット演算子による参照の優先順位についての詳細は documentation of template variables を参照してください。
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 %}
and
と or
は同じタグの中で同時に使用できます。このとき優先順位は and
が優先します:
{% if athlete_list and coach_list or cheerleader_list %}
これは以下のように解釈されます:
if (athlete_list and coach_list) or cheerleader_list
実際には if
タグの中で丸括弧を使うことはできません。優先順位を示す必要がある場合には、if
タグを入れ子にして表してください。
if
tags may also use the operators ==
, !=
, <
, >
,
<=
, >=
, in
, not in
, is
, and is not
which work as
follows:
==
演算子¶
等しい場合。例:
{% 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
演算子¶
Object identity. Tests if two values are the same object. Example:
{% 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
operator¶
Negated object identity. Tests if two values are not the same object. This is
the negation of the is
operator. Example:
{% 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 %}
ifequal
と ifnotequal
¶
{% ifequal a b %} ... {% endifequal %}
は、 {% if a == b %} ... {% endif %}
の古い書き方です。同様に、 {% ifnotequal a b %} ... {% endifnotequal %}
という書き方も {% if a != b %} ... {% endif %}
に代わっています。 ifequal
と ifnotequal
タグは、将来のリリースで廃止される可能性があります。
ifchanged
¶
値が前回のループ実行時から変わっているかどうかを調べます。
{% ifchanged %}
ブロックタグはループの内部で使います。このタグには 2 通りの使い方があります。
今回の出力内容が、前回の状態に対して変化しているときだけ表示します。例えば、日付の一覧を表示する場合に、月が変わったときだけ月名を表示したければ以下のようにします:
<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 %}
タグに 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" %}
Normally the template name is relative to the template loader’s root directory.
A string argument may also be a relative path starting with ./
or ../
as described in the extends
tag.
相対パスで指定できるようになりました。
次の例では、変数 template_name
の値をテンプレート名として、そのテンプレートの内容を include します:
{% include template_name %}
変数は、コンテキストを受け取る render()
メソッドを持っていればオブジェクトでも構いません。これによって、コンテキスト内のコンパイル済みの 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 したテンプレートの出力中に例外処理が発生する場合 (存在しない、あるいは文法エラーの場合) の動作は、 template engine
の debug
オプションによって異なります ( 未設定の場合は DEBUG
の値をデフォルトとします ) 。デバッグモードがオンの場合には、 TemplateDoesNotExist
や TemplateSyntaxError
といった例外が発生します。デバッグモードがオフの場合には、 {% include %}
は取り込んだテンプレートを出力する間に起こった例外に関する警告メッセージを django.template
ロガーに記録し、出力は空の文字列を返します。
バージョン 1.11 で撤廃: Silencing exceptions raised while rendering the {% include %}
template
tag is deprecated. In Django 2.1, the exception will be raised.
注釈
include
タグの実行は『サブテンプレートを出力し、その結果である HTML を取り込む』と考えるべきで、『サブテンプレートを解析し、親テンプレートの一部分として、そこに組み込まれている』かのように考えるべきではありません。これは、取り込んだテンプレートの間では状態を共有できず、まったく独立した過程で出力されることを意味します。
ブロックは取り込まれる 前に 評価されます。ブロックを含んでいる他のテンプレートを取り込む場合、そのブロックは『 すでに評価され、出力された結果 』としてのブロックであり、例えばテンプレートを継承したときのような、オーバーライド可能なブロックではありません。
load
¶
カスタムのテンプレートタグセットを読み込みます。
例えば次のテンプレートは somelibrary
、そして package
パッケージの``otherlibrary`` に登録されたすべてのタグとフィルタを読み込みます。:
{% load somelibrary package.otherlibrary %}
引数に from
を使えば、ライブラリからフィルタやタグを個別に選んで読み込むことができます。以下の例では、 foo
、bar
という名前のテンプレートタグまたはフィルタを somelibrary
から読み込みます:
{% load foo bar from somelibrary %}
詳しくは Custom tag and filter libraries を参照してください。
lorem
¶
ランダムな」lorem ipsum」 のラテン語テキストを表示させます。テンプレート内でサンプルデータを用意するのに便利です。
使い方は以下の通りです:
{% lorem [count] [method] [random] %}
{% lorem %}
タグは 0 から 3 個の引数をとります:
Argument | 説明 |
---|---|
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_FORMAT
、 DATETIME_FORMAT
、 SHORT_DATE_FORMAT
、 SHORT_DATETIME_FORMAT
)の中から 1 つを選ぶこともできます。 表示形式のローカル化 が有効なときは、プリセットフォーマットの内容は現在設定されているロケールによって変わります。
It is {% now "SHORT_DATETIME_FORMAT" %}
出力を (文字列として) 変数に入れる場合には {% now "Y" as current_year %}
の書式が使えます。これは blocktrans
のようなテンプレートタグで {% now %}
を使いたいときに役立ちます:
{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
regroup
¶
オブジェクトのリストから、同じ属性値を持つオブジェクトのグループを作ります。
This complex tag is best illustrated by way of an example: say that cities
is a list of cities represented by dictionaries containing "name"
,
"population"
, and "country"
keys:
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 %}
produces a list (in this case, country_list
) of
group objects. Group objects are instances of
namedtuple()
with two fields:
grouper
– グループ分けに使われた要素 ( ここでは 「India」 「Japan」 といった文字列 )list
– このグループ内のすべての要素からなるリスト ( たとえば country=』India』 であるすべての都市のリスト)
The group object was changed from a dictionary to a
namedtuple()
.
Because {% regroup %}
produces namedtuple()
objects,
you can also write the previous example as:
{% 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
の順に並べられて いなかった 場合、 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 %}
また、 country
が choices
をともなうフィールドである場合、それは属性として使える get_FOO_display()
メソッドを持っているので choices
のキーではなく表示文字列でグループ化することができます。
{% regroup cities by get_country_display as country_list %}
このとき {{ country.grouper }}
は choices
の辞書から、キーではなく値のフィールドを表示することでしょう。
resetcycle
¶
Resets a previous cycle so that it restarts from its first item at its next
encounter. Without arguments, {% resetcycle %}
will reset the last
{% cycle %}
defined in the template.
使い方の例:
{% 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>
Notice how the first block ends with class="odd"
and the new one starts
with class="odd"
. Without the {% resetcycle %}
tag, the second block
would start with class="even"
.
You can also reset named cycle tags:
{% 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 %}
In this example, we have both the alternating odd/even rows and a 「major」 row every fifth row. Only the five-row cycle is reset when a category changes.
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
¶
テンプレートタグの構文で使われる文字を、通常の文字として出力します。
Django のテンプレートには 「エスケープ」 の概念がないため、テンプレートタグで使われる文字を出力させるには {% templatetag %} タグを使わねばなりません。
どの要素を出力するかは、引数で指定します:
Argument | 出力 |
---|---|
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 %}
第 1 引数は url()
の name
です。これは引用符で括ったリテラル、またはその他のコンテキスト変数です。続く引数はオプションで、空白で区切って指定します。引数はそれぞれ URL の引数として使われます。上の例では固定引数によって引数を指定していますが、代わりにキーワード引数で指定することもできます:
{% url 'some-url-name' arg1=v1 arg2=v2 %}
1 つの呼び出しのなかで、固定引数とキーワード引数を混ぜることはできません。また URLconf で必要とされる引数はすべて指定しなければなりません。
例えば app_views.client
という名前のビューがあって、クライアントの ID を引数に取るとしましょう ( client()
は、 views ファイル app_views.py
の中で定義されているメソッドです ) 。 URLconf は以下のようなものになるでしょう:
('^client/([0-9]+)/$', app_views.client, name='app-views-client')
このアプリケーションの URLconf が、プロジェクトの URLconf の中に次のような形で include されていたとします:
('^clients/', include('project_name.app_name.urls'))
…このとき、テンプレート内でこのビューへのリンクを作るには、次のようにします:
{% url 'app-views-client' client.id %}
テンプレートタグの出力は、文字列 /clients/client/123/
となります。
Note that if the URL you’re reversing doesn’t exist, you’ll get an
NoReverseMatch
exception raised, which will cause your
site to display an error page.
ページを表示させずに 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' %}
これは通常の namespaced URL resolution strategy に従います。ここには現在のアプリケーションに関してコンテキストから得られる様々なヒントについて書かれています。
警告
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
¶
バーチャートなどを生成する場合のために、指定した値と最大値との比を計算し、 定数に掛けた値を返します。
For example:
<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
の結果を変数に入れてキャプチャーしたい場合があります。例えば blocktrans
で使う場合、次のようにできます:
{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}
with
¶
複雑な表現の変数の値をキャッシュし、簡単な名前で参照できるようにします。呼出しコストの高いメソッド (例えばデータベースを操作するようなメソッド) に何度もアクセスする際に便利です。
For example:
{% 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
¶
入力値に対して引数の値を加算します。
For example:
{{ 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 などの文字列をエスケープする際に便利です。
For example:
{{ value|addslashes }}
value
の値が "I'm using Django"
のとき、出力は "I\'m using Django"
となります。
capfirst
¶
入力値の先頭の文字を大文字に変換します。最初の文字がアルファベットでなければ効果はありません。
For example:
{{ value|capfirst }}
If value
is "django"
, the output will be "Django"
.
center
¶
入力値を引数で指定された幅のフィールド内に中央寄せします。
For example:
"{{ value|center:"15" }}"
value
の値が "django"
のとき、出力は " Django "
となります。
cut
¶
入力値の中から、引数に指定した値を全て取り除きます。
For example:
{{ value|cut:" " }}
value
の値が "String with spaces"
のとき、出力は "Stringwithspaces"
となります。
date
¶
引数に指定した書式で日付をフォーマットします。
いくつかの違いはありますが、フォーマットには PHP の date()
関数 ( https://php.net/date ) に似た書式を使います。
注釈
これらのフォーマット文字は、テンプレート以外では使えません。デザイナーが PHP のテンプレートから容易に変換できるように互換性を持たせています。
利用可能なフォーマット文字:
フォーマット文字 | 説明 | 出力の例 |
---|---|---|
a | 'a.m.' または 'p.m.' ( 注: PHP における出力と少し異なり、 AP スタイルブックに従ってピリオドをつけます ) |
'a.m.' |
A | 'AM' または 'PM' |
'AM' |
b | 月。アルファベット(小文字) 3 文字のテキスト形式です。 | 'jan' |
B | 実装されていません。 | |
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 |
d | 日。 2 桁のゼロ詰め表示です。 | '01' ~ '31' |
D | 曜日。 アルファベット 3 文字のテキスト形式です。 | 'Fri' |
e | タイムゾーン名。どのフォーマットでも使えますが、 datetime によっては空の文字列を返す場合もあります。 | '' , 'GMT' , '-500' , 'US/Eastern' など |
E | 月。ロケールが定義する代替表現が使われ、通常は長いテキスト形式になります。 | 'listopada' ( ロケールがポーランド語の場合。ポーランド語 ``』Listopad( 11 月)』``の、時制における変化形 ) |
f | 時と分(12 時間表記)。ただしゼロ分であるときは時間だけを表示します。これは独自の拡張です。 | '1' ~ '12' |
F | 月。長いテキスト形式で表したものです。 | 'January' |
g | 時( 12 時間表記)。ゼロ埋め表示なし。 | '1' ~ '12' |
G | 時( 24 時間表記)。ゼロ埋め表示なし。 | '0' ~ '23' |
h | 時( 12 時間表記)。 | '01' ~ '12' |
H | 時( 24 時間表記)。 | '00' ~ '23' |
i | 分。 | '00' ~ '59' |
I | 夏時間(DST)が有効か、そうでないかを表します。 | '1' または '0' |
j | 日。ゼロ埋め表示なし。 | '1' ~ '31' |
l | 曜日。長いテキスト形式です。 | 'Friday' |
L | うるう年かどうかを表すブール値です。 | True または False |
m | 月。数字 2 桁で、ゼロ埋め表示します。 | '01' ~ '12' |
M | 月。アルファベット 3 文字のテキスト形式です。 | 'Jan' |
n | 月。ゼロ埋め表示しません。 | '1' ~ '12' |
N | AP スタイルブックによる月の省略表記。独自の拡張です。 | 'Jan.' , 'Feb.' , 'March' , 'May' |
o | ISO-8601 の週番号付き記法による年。うるう週を用いた ISO-8601 週番号 (W) に対応します。一般的な年のフォーマットは Y を参照してください。 | '1999' |
O | グリニッジ標準時からの時差。 | '+0200' |
P | 時刻。12 時間表記による 時間:分 に続けて ‘a.m.’ または ’p.m.’ を表示します。ゼロ分である場合には分の表示が省略され、必要に応じて ‘midnight’ または ‘noon’ の表示になります。 独自の拡張です。 | '1 a.m.' , '1:30 p.m.' , 'midnight' , 'noon' , '12:30 p.m.' |
r | RFC 5322 formatted date. | 'Thu, 21 Dec 2000 16:01:07 +0200' |
s | 秒。数字 2 桁で、ゼロ埋め表示です。 | '00' ~ '59' |
S | 日を表わす数字につける、英語特有の接尾辞。アルファベット 2 文字です。 | 'st' , 'nd' , 'rd' or 'th' |
t | その月の日数。 | 28 ~ 31 |
T | 計算機のタイムゾーン設定。 | 'EST' , 'MDT' |
u | マイクロ秒。 | 000000 ~ 999999 |
U | Unix エポック時 ( UTC 協定世界時 1970年1月1日 00:00:00 ) からの秒数。 | |
w | 曜日(数字 1 桁)。 | '0' (日曜) ~ '6' (土曜) |
W | ISO-8601 による年間の週番号。 週は月曜日から始まります。 | 1 , 53 |
y | 年( 2 桁)。 | '99' |
Y | 年( 4 桁)。 | '1999' |
z | 日(1年間における) | 0 ~ 365 |
Z | タイムゾーンオフセットを秒であらわしたもの。UTC よりも西側のタイムゾーン値は全て負の値になり、東側の値は常に正になります。 | -43200 ~ 43200 |
For example:
{{ 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つ、または上記の表で示したフォーマット指定文字を使ったカスタムフォーマットが使えます。プリセットのフォーマットは、現在のロケールに応じて表示が変化することに注意してください。
USE_L10N
が True
であるとして、例えば LANGUAGE_CODE
が "es"
(スペイン語)である場合:
{{ value|date:"SHORT_DATE_FORMAT" }}
上記の出力は、文字列 "09/01/2008"
となります ( es
ロケールの "SHORT_DATE_FORMAT"
フォーマットは、 Django の初期設定では "d/m/Y"
です)。
When used without a format string, the DATE_FORMAT
format specifier is
used. Assuming the same settings as the previous example:
{{ value|date }}
outputs 9 de Enero de 2008
(the DATE_FORMAT
format specifier for the
es
locale is r'j \d\e F \d\e Y'
.
In older versions, the DATE_FORMAT
setting (without
localization) is always used when a format string isn’t given.
date
を time
フィルタに繋ぐことで、datetime
の表現をすべて表示させることができます。例えば次のようにします:
{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}
default
¶
入力の評価値が False
の場合、引数に指定したデフォルト値を使います。そうでなければ、入力値を使います。
For example:
{{ value|default:"nothing" }}
value
が ""
( 空の文字列 ) のとき、出力は ``nothing``になります。
default_if_none
¶
入力値が None
であるとき ( None
であるときのみ ) 、引数に指定したデフォルト値を使いま す。そうでなければ、入力値を使います。
空の文字列が入力された場合は、デフォルト値を 使わない ことに注意してください。空文字列をフォールバックしたければ default
フィルタを使ってください。
For example:
{{ value|default_if_none:"nothing" }}
If value
is None
, the output will be nothing
.
dictsort
¶
辞書のリストを入力として、引数に指定したキーでリストをソートして返します。
For example:
{{ 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
can also order a list of lists (or any other object implementing
__getitem__()
) by elements at specified index. For example:
{{ value|dictsort:0 }}
value
が以下の内容であるとします:
[
('a', '42'),
('c', 'string'),
('b', 'foo'),
]
このとき出力は以下のようになるでしょう:
[
('a', '42'),
('b', 'foo'),
('c', 'string'),
]
You must pass the index as an integer rather than a string. The following produce empty output:
{{ values|dictsort:"0" }}
The ability to order a list of lists was added.
dictsortreversed
¶
辞書のリストを入力に取り、引数に指定したキーでリストを逆順にソートして返します。これは上のフィルタと全く同じ処理をしますが、返す値は逆順です。
divisibleby
¶
値が引数の値で割り切れる場合に True
を返します。
For example:
{{ value|divisibleby:"3" }}
value
が 21
であるとき、出力は True
です。
escape
¶
入力文字中にある HTML の特殊文字をエスケープします。具体的には、以下のような置換を行います:
<
を<
に変換>
を>
に変換'
( シングルクォート ) を'
に変換"
( ダブルクォート ) を"
に変換&
を&
に変換
エスケープは文字列の出力段階にのみ適用されます。フィルタを連鎖している場合、連鎖のどこに escape
が置かれていても、エスケープ処理が行われるのはフィルタの一番最後の段階です。エスケープをその場でただちに適用したい場合、 force_escape
フィルタを使用してください。
escape
を変数に適用するとき、変数にはすでに自動エスケープが適用されているかもしれませんが、エスケープが二重に実行されることはありません。したがって自動エスケープ環境であっても、この機能は安全に使用できます。複数回のエスケープが適用されるようにしたい場合は force_escape
フィルターを使用してください。
以下は autoescape
がオフであるときに、フィールドに escape
を適用する例です:
{% autoescape off %}
{{ title|escape }}
{% endautoescape %}
バージョン 1.10 で撤廃: The 「lazy」 behavior of the escape
filter is deprecated. It will change
to immediately apply conditional_escape()
in
Django 2.0.
escapejs
¶
JavaScript の文字列リテラルとして扱うために文字エスケープを行います。エスケープ結果は、 HTML としては安全では ありません が、JavaScrpt/JSON を生成するテンプレートの出力が構文エラーを引き起こすことを防ぎます。
For example:
{{ 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』 など) に変換します。
For example:
{{ value|filesizeformat }}
value
が 123456789 のとき、出力は 117.7 MB
になります。
ファイルサイズと国際単位系(SI)
filesizeformat
は、厳密には国際単位系(SI)に準拠していません。国際単位系ではバイトサイズを 1024 の累乗で計算する場合 (上の例がそうですが) 、 KiB、MiB、GiB などの単位を使うよう推奨しています。しかし Django ではより一般的な表記に対応して、従来の単位名( KB、 MB、GB など)を使用しています。
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
を引数なしで使用した場合の動作は、引数に -1
を指定した場合と同じです。
force_escape
¶
文字列に HTML エスケープを適用します。 ( 詳しくは escape
フィルタを参照してください )。フィルタは 即座に 適用され、新たなエスケープ済みの文字列を返します。このタグが有用となるケースは稀で、複数回のエスケープが必要な場合や、エスケープされた結果に対して他のフィルタを適用したい場合に使います。通常は escape
フィルタを使うことになるでしょう。
例えば linebreaks
フィルタから生成された HTML 要素 <p>
を捕らえたい場合、次のようになります:
{% autoescape off %}
{{ body|linebreaks|force_escape }}
{% endautoescape %}
get_digit
¶
入力値が整数であるとき、引数で指定された桁にある数字を返します。例えば引数が 1 のとき右端の桁、 2 のとき右から 2 桁目が指定されます。入力が整数でない場合には、入力値をそのまま返します。
For example:
{{ value|get_digit:"2" }}
value
が 123456789
のとき、出力は 8
です。
iriencode
¶
IRI (国際化リソース識別子 Internationalized Resource Identifier) を URL に適した文字列に変換します。これは非 ASCII 文字列を URL に埋め込む場合に必要なフィルタです。
urlencode
フィルタを通した後の文字列を、このフィルタに通しても問題はありません。
For example:
{{ value|iriencode }}
value
の値が "?test=1&me=2"
のとき、出力は "?test=1&me=2"
になります。
join
¶
Python の str.join(list)
と同じく、リストを文字列でつなぎます。
For example:
{{ value|join:" // " }}
value
の値がリスト ['a', 'b', 'c']
であるとき、出力は文字列 "a // b // c"
となります。
last
¶
リストの末尾の要素を返します。
For example:
{{ value|last }}
value
の値がリスト ['a', 'b', 'c', 'd']
のとき、出力は文字列 "d"
です。
length
¶
入力値の長さを返します。これは、文字列とリストの両方で動作します。
For example:
{{ value|length }}
value
が ['a', 'b', 'c', 'd']
、 "abcd"
であるとき、それぞれ出力は 4
になります。
The filter returns 0
for an undefined variable.
length_is
¶
入力値の長さと引数が等しければ True
を返し、そうでなければ False
を返します。
For example:
{{ value|length_is:"4" }}
value
が ['a', 'b', 'c', 'd']
あるいは "abcd"
であるとき、それぞれ出力は True
です。
linebreaks
¶
プレーンテキストの改行を適切な HTML タグに変換します。 改行 1 つは改行タグ (<br />
) に、改行およびそれに続く空行は段落タグ (</p>
) に変換されます。
For example:
{{ value|linebreaks }}
value
が Joel\nis a slug
であるとき、出力は <p>Joel<br />is a slug</p>
になります。
linebreaksbr
¶
プレーンテキストの改行を HTML の改行タグ (<br />
) に変換します。
For example:
{{ value|linebreaksbr }}
value
が Joel\nis a slug
であるとき、出力は Joel<br />is a slug
になります。
linenumbers
¶
テキストを行番号付きで表示します。
For example:
{{ value|linenumbers }}
value
が次の内容であるとき:
one
two
three
その出力は次のようになります:
1. one
2. two
3. three
ljust
¶
入力値を指定した幅のフィールド内で左詰めします。
引数: フィールドの幅
For example:
"{{ value|ljust:"10" }}"
value
が Django
であるとき、出力は "Django "
となります。
lower
¶
文字列を全て小文字に変換します。
For example:
{{ value|lower }}
value
が Totally LOVING this Album!
であるとき、出力は totally loving this album!
となります。
make_list
¶
入力値をリストに変換します。文字列の場合は、各文字からなるリストになります。整数の場合にはユニコード文字列に型変換した後、各文字からなるリストに変換します。
For example:
{{ value|make_list }}
value
の値が文字列 "Joel"
であるとき、出力はリスト ['J', 'o', 'e', 'l']
です。 value
が 123
のとき、出力はリスト ['1', '2', '3']
となります。
phone2numeric
¶
電話番号 (文字を含む場合もあります) を数値だけの番号に変換します。
入力値は正しい電話番号でなくてもかまいません。このフィルタはどんな文字列でも変換します。
For example:
{{ value|phone2numeric }}
value
が 800-COLLECT
のとき、出力は 800-2655328
となります。
pluralize
¶
入力値が 1 でない場合に、複数形を表す接尾辞を返します。デフォルトでは、接尾辞は 's'
です。
実装例:
You have {{ num_messages }} message{{ num_messages|pluralize }}.
num_messages
が 1
のとき、出力は You have 1 message.
です。 num_messages
が 2
のとき、出力は You have 2 messages.
となります。
's'
以外の接尾辞が必要な場合は、代わりの接尾辞をフィルタの引数で指定できます。
実装例:
You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.
単純な接尾辞では複数形にできない単語の場合、単数形と複数形の接尾辞の両方をコンマで区切って指定できます。
実装例:
You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.
注釈
飜訳された文字列を複数形に変換するときは blocktrans
を使ってください。
pprint
¶
pprint.pprint()
のラッパーです -– 実のところ、これはデバッグ用です。
random
¶
与えられたリストからランダムな要素を返します。
For example:
{{ value|random }}
value
の値がリスト ['a', 'b', 'c', 'd']
であるとき、出力は "b"
かもしれません。
rjust
¶
入力値を指定した幅のフィールド内で右詰めします。
引数: フィールドの幅
For example:
"{{ value|rjust:"10" }}"
value
が Django
であるとき、出力は " Django"
となります。
safe
¶
文字列に対して、さらなる HTML エスケープが必要でないことをマークするのに使います。 autoescaping がオフの場合、このフィルタは何もしません。
注釈
フィルタを連鎖させる場合、 safe
の後に適用されるフィルタはその内容を再び安全でない状態にしてしまうことが可能です。例えば以下のコードは、変数をそのまま、エスケープされない状態で出力します:
{{ var|safe|escape }}
safeseq
¶
シーケンスのそれぞれの要素に対して safe
フィルタを適用します。これは例えば join
のような、シーケンスを処理する他のフィルタと組み合わせて使うのが便利です。例をあげます:
{{ some_list|safeseq|join:", " }}
この場合、直接 safe
フィルタを使用すると正しく動作しないかもしれません。シーケンスの個々の要素に対して作用するのではなく、まず変数を文字列に変換して処理するからです。
slice
¶
リストに対するスライスを返します。
Python におけるリストのスライスと同じ構文を使います。スライスについて学ぶには、 http://www.diveintopython3.net/native-datatypes.html#slicinglists を参照してください。
実装例:
{{ some_list|slice:":2" }}
some_list
が ['a', 'b', 'c']
ならば、出力は ['a', 'b']
となります。
slugify
¶
ASCIIに変換します。スペースをハイフンに変換します。英数字以外の文字、アンダースコア、ハイフンは削除します。小文字に変換します。また、先頭と末尾の空白を取り除きます。
For example:
{{ value|slugify }}
value
が "<b>Joel</b> <button>is</button> a <span>slug</span>"
であるとき、出力は "Joel is a slug"
となります。
stringformat
¶
引数 (表示形式を指定する文字列) に応じて、変数の表示形式を変更します。指定方法には、printf-style String Formatting シンタックスを使います。例外として、最初の 『』%』』 は無視されます。
For example:
{{ value|stringformat:"E" }}
例えば value
が 10
の場合、出力は 1.000000E+01
となります。
striptags
¶
[X]HTML タグを全てはぎとるようにします。
For example:
{{ value|striptags }}
value
が "<b>Joel</b> <button>is</button> a <span>slug</span>"
であるとき、出力は "Joel is a slug"
となります。
安全性の保証はありません
注意してください。 striptags
の出力は HTML の安全性、特に不正な HTML の入力に対して何の保証もありません。 striptags
の出力に safe
フィルタを適用しては**いけません**。 より堅牢な方法を求めるならば、 Python の bleach
ライブラリ、特に clean メソッドを使用できます。
time
¶
時刻を指定の書式にしたがってフォーマットします。
フォーマットは date
と同様に、あらかじめ定義された TIME_FORMAT
のプリセット、またはカスタムフォーマットを使うこともできます。この定義はロケールに依存することに注意してください。
For example:
{{ value|time:"H:i" }}
value
が datetime.datetime.now()
の値であるとき、出力は "01:23"
といった文字列になります。
その他の例:
USE_L10N
が True
で、LANGUAGE_CODE
が例としてドイツ語を表す "de"
だったとします:
{{ value|time:"TIME_FORMAT" }}
the output will be the string "01:23"
(The "TIME_FORMAT"
format
specifier for the de
locale as shipped with Django is "H:i"
).
time
フィルタが受け取る引数は、1日における時刻に関連したフォーマット文字列だけで、日付は受け付けません(理由は言うまでもありませんよね)。日付
のフォーマットを行いたいときは、 date
フィルタを使ってください ( datetime
の値をすべて表示させたい場合は time
とともに使います)。
上記のルールにはひとつ例外があります。タイムゾーン情報つきの datetime
の値 (a time-zone-aware datetime
instance) を渡した場合、 time
フィルタはタイムゾーン関連の format specifiers である 'e'
、'O'
、'T'
、'Z'
を受け付けます。
When used without a format string, the TIME_FORMAT
format specifier is
used:
{{ value|time }}
is the same as:
{{ value|time:"TIME_FORMAT" }}
In older versions, the TIME_FORMAT
setting (without
localization) is always used when a format string isn’t given.
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
¶
文字列中の単語に対して、それぞれ先頭の文字を大文字に、残りを小文字にすることで文字列をタイトルケースに変換します。」主要でない単語」 については小文字を維持できないこともあります。
For example:
{{ value|title }}
value
が "my FIRST post"
であるとき、出力は "My First Post"
となります。
truncatechars
¶
文字列を指定された文字数以内に切り詰めます。文字数が指定された値より大きいときに文字列を切り詰め、末尾を省略記号 (「…」) に置き換えます。
引数: 切り詰める文字数
For example:
{{ value|truncatechars:9 }}
value
が "Joel is a slug"
であるとき、出力は "Joel i..."
となります。
truncatechars_html
¶
truncatechars
に似ていますが、 HTML タグを認識します。切り詰めを行う時点で閉じていないタグがあれば、切り詰めた文字の直後に全て閉じます。
For example:
{{ value|truncatechars_html:9 }}
value
が "<p>Joel is a slug</p>"
であるとき、出力は "<p>Joel i...</p>"
となります。
HTML コンテンツ内の改行は保持されます。
truncatewords
¶
文字列を指定された単語数以内に切り詰めます。
引数: 切り詰めた後の単語数
For example:
{{ value|truncatewords:2 }}
value
が "Joel is a slug"
であるとき、出力は "Joel is ..."
となります。
文字列中の改行は取り除かれます。
truncatewords_html
¶
truncatewords
に似ていますが、 HTML タグを認識します。切り詰めを行う時点で閉じていないタグがあれば、切り詰めた文字の直後に全て閉じます。
このタグの処理は truncatewords
よりも効率が悪いため、 HTML テキストを 渡す場合にだけ使うようにしてください。
For example:
{{ value|truncatewords_html:2 }}
value
が "<p>Joel is a slug</p>"
であるとき、出力は "<p>Joel is ...</p>"
になります。
HTML コンテンツ内の改行は保持されます。
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
¶
入力値をすべて大文字に変換します。
For example:
{{ value|upper }}
value
が "Joel is a slug"
であるとき、出力は "JOEL IS A SLUG"
となります。
urlencode
¶
入力値を URL で使えるようにエスケープします。
For example:
{{ 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
は変換されます。
Links can have trailing punctuation (periods, commas, close-parens) and leading
punctuation (opening parens), and urlize
will still do the right thing.
urlize
が生成したリンクにはアトリビュート rel="nofollow"
が加えられています。
For example:
{{ 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
をとることができます。autoescape
が True
のとき、リンクテキストと URL は Django の組み込みフィルタ escape
でエスケープされます。指定しない場合の autoescape
の値は True
です。
注釈
すでに HTML マークアップを含んでいるテキストに urlize
を適用すると予期しない結果となります。このフィルタはプレーンテキストにだけ適用してください。
urlizetrunc
¶
urlize と同じように、URL と email アドレスをクリック可能なリンクに変換します。ただし、指定の文字数以上の表示を切り詰めます。
引数: URL を切り詰める長さ。省略記号の長さを含みます。省略記号は省略が必要な場合につけられます。
For example:
{{ value|urlizetrunc:15 }}
value
が "Check out www.djangoproject.com"
であるとき、出力は "Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>"
となります。
urlize と同じく、このフィルタはプレーンテキストに対してだけ使ってください。
wordwrap
¶
指定した行幅でワードラップします。
引数: テキストをラップするまでのワード数
For example:
{{ value|wordwrap:5 }}
value
が Joel is a slug
であるとき、出力は以下のようになります:
Joel
is a
slug
yesno
¶
入力値 ( 「True」 、 「False」 、オプションで 「None」 ) に対応する文字列を返します。対応する文字列はデフォルトでは 「yes」、」no」、」maybe」 です。またコンマ区切りの文字列を引数として与えることでカスタムマッピングを指定できます。
For example:
{{ value|yesno:"yeah,no,maybe" }}
値 | Argument | 出力 |
---|---|---|
True |
yes |
|
True |
"yeah,no,maybe" |
yeah |
False |
"yeah,no,maybe" |
no |
None |
"yeah,no,maybe" |
maybe |
None |
"yeah,no" |
no (None に対応する値がない場合は False の値が使われます) |
国際化タグとフィルタ¶
Django はテンプレートの internationalization をそれぞれの角度から制御するタグやフィルタを提供し、翻訳、書式設定、およびタイムゾーン変換のきめ細かい制御を可能にしています。
i18n
¶
このライブラリは、テンプレート内の飜訳可能なテキストを指定することができます。これを有効化するには USE_I18N
を True
に設定し、 {% load i18n %}
でロードします。
ローカル化: テンプレート内 も参照してください。
l10n
¶
このライブラリは、テンプレート内の値のローカライズを制御します。必要なのは {% load l10n %}
でライブラリをロードすることだけですが、ローカライズをデフォルトで有効にするため USE_L10N
を True
に設定する場合もしばしばあるでしょう。
テンプレート内でローカル化をコントロールする も参照してください。
tz
¶
このライブラリは、テンプレートのタイムゾーン変換を制御します。 l10n
と同じく、必要なのは {% load tz %}
を使ってライブラリをロードするだけですが、通常はデフォルトでローカル時間に変換されるよう、 USE_TZ
を True
に設定するでしょう。
テンプレートでのタイムゾーン aware な出力 も参照してください。
その他のタグとフィルタライブラリ¶
この他にも、Django にはいくつかのテンプレートタグ・ライブラリがあります。これらのライブラリは INSTALLED_APPS
設定で明示的に有効化したうえ、 {% load %}
タグを使ってテンプレート上にロードする必要があります。
django.contrib.humanize
¶
データを「ヒトにやさしい」表現にする上で便利な Django テンプレートフィルタのセットです。くわしくは :doc:`/ref/contrib/humanize`を参照してください。
static
¶
static
¶
To link to static files that are saved in STATIC_ROOT
Django ships
with a static
template tag. If the django.contrib.staticfiles
app is installed, the tag will serve files using url()
method of the
storage specified by STATICFILES_STORAGE
. For example:
{% 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 }}"></img>
Jinja2 テンプレートを使う?
See Jinja2
for information on
using the static
tag with Jinja2.
In older versions, you had to use {% load static from staticfiles %}
in
your template to serve files from the storage defined in
STATICFILES_STORAGE
. This is no longer required.
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 コンテキスト内で使用したい場合に適切なエスケープがなされていることが保証されます。