概要
Djangoのテンプレート内での変数展開は{{ 変数 }}
と記述。
- 単純変数はそのまま内容が展開される
- コレクションはリスト、タプル、辞書に応じた表現になる
- コレクションの要素は
[]
ではなくドット(.
)で添字やキーを指定 - オブジェクトの属性やメソッドもドット(
.
)で指定
単純変数
単純変数の展開の例を以下に示す。まずview関数。
1 2 3 4 5 6 7 8 9 |
from django.shortcuts import render def variable(request): context = { 'var_float': 3.1415, 'var_string': 'ABCDいろはに', } return render(request, 'dtldemo/variable.html', context) |
テンプレートの変数展開部分。
1 2 3 4 5 |
<p>単純変数</p> <ul> <li>実数値:{{ var_float }}</li> <li>文字列:{{ var_string }}</li> </ul> |
ブラウザーの表示。
単純変数
- 実数値:3.1415
- 文字列:ABCDいろはに
コレクション
コレクションを参照する変数を展開すると、変数をprint
文でコンソール出力した時の形式で展開される。
1 2 3 4 5 6 7 8 9 10 |
from django.shortcuts import render def variable(request): context = { 'var_list': ['one', 2, [3, 'three']], 'var_tuple': ('one', 2, (3, 'three')), 'var_dict': {'one': 1, 'two': 2, 'three': 3}, } return render(request, 'dtldemo/variable.html', context) |
テンプレートの変数展開部分。
1 2 3 4 5 6 |
<p>コレクション</p> <ul> <li>リスト:{{ var_list }}</li> <li>タプル:{{ var_tuple }}</li> <li>辞 書:{{ var_dict }}</li> </ul> |
ブラウザーの表示。
コレクション
- リスト:[‘one’, 2, [3, ‘three’]]
- タプル:(‘one’, 2, (3, ‘three’))
- 辞 書:{‘one’: 1, ‘two’: 2, ‘three’: 3}
コレクションの要素を展開する場合、Pythonの[]
と違ってドット(.
)に続けて添字の数値やキーの文字列をそのまま書く。
1 |
{{ 変数.添字 }} または {{ 変数.キー }} |
多次元の場合には、次数に対応して連ねていく。
1 |
{{ 変数.1次元目.2次元目 }} |
コレクション全体と同じ例で要素を表示したいときのテンプレートの例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<p>コレクションの要素</p> <ul> <li> リストの要素:{{ var_list.0 }}, {{ var_list.1 }}, {{ var_list.2.0 }}, {{ var_list.2.1 }} </li> <li> タプルの要素:{{ var_tuple.0 }}, {{ var_tuple.1 }}, {{ var_tuple.2.0 }}, {{ var_tuple.2.1 }} </li> <li> 辞書の要素 :{{ var_dict.one }}, {{ var_dict.two }}, {{ var_dict.three }} </li> </ul> |
ブラウザーの表示。
コレクションの要素
- リストの要素:one, 2, 3, three
- タプルの要素:one, 2, 3, three
- 辞書の要素 :1, 2, 3
オブジェクト
クラスのインスタンスを参照する変数も展開できる。以下はviews.py
で単純なクラスを定義して、そのインスタンスをテンプレートに渡している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from django.shortcuts import render class BinaryOperation: def __init__(self, a, b): self.a = a self.b = b def add(self): return self.a + self.b def variable(request): var_obj = BinaryOperation(2, 3) context = { 'var_obj': var_obj, } return render(request, 'dtldemo/variable.html', context) |
テンプレートでのオブジェクトの展開は、以下の3種類となる。
- オブジェクト全体を展開すると、オブジェクトが文字列にキャストされた表現となる
- オブジェクトの属性は、変数と属性名をドット(
.
)で繋いで得られる - オブジェクトとメソッド名をドット(
.
)で繋ぐと、メソッドの実行結果が得られる
1 2 3 4 5 6 |
<p>オブジェクト</p> <ul> <li>オブジェクト全体:{{ var_obj }}</li> <li>オブジェクトの属性:{{ var_obj.a }}, {{ var_obj.b }}</li> <li>オブジェクトのメソッド:{{ var_obj.add }}</li> </ul> |
ブラウザーでの表示。
オブジェクト
- オブジェクト全体:<dtldemo.views.BinaryOperation object at 0x7fdf2835ec50>
- オブジェクトの属性:2, 3
- オブジェクトのメソッド:5
フィルター
基本形
フィルターはテンプレート中の変数を加工するもので、Djangoによる組み込みフィルターが多数用意されている。フィルターの基本形は以下のとおり。
{{ 変数|フィルター }}
わかりやすい例としては、変数の文字列の文字数を返すlength
がある。以下のテンプレートでは、var_string
に格納されている文字列とその文字数を表示している。
1 |
文字列{{ var_string }}の文字数は{{ var_string|length }}です |
変数の内容が'abcd'
の場合、表示は以下のようになる。
1 |
文字列abcdeの文字数は5です |
引数
フィルターには引数を持つものもある。引数はリテラルとする必要がある。
{{ 変数|フィルター:引数 }}
以下の例はadd
フィルターで、元の変数の内容に引数の内容を加える。
1 2 |
<p>{{ var_two|add:3 }}</p> <p>{{ var_string|add:'XYZ'}}</p> |
var_two=2
、var_string='abcde'
の場合、表示は以下のようになる。
1 2 |
5 abcdeXYZ |
チェーン
フィルターのチェーンによって、複数のフィルターを作用させることができる。
{{ 変数|フィルター[:引数]|フィルター[:引数] ... }}
以下の例では変数の文字列に文字列定数を連結した上で文字数を得ている。
1 |
{{ var_string|add:'efg'|length }} |
var_string='abcde'
の場合、結果は’8'
となる。
スペースとエラー
'|'
や':'
の前後にスペースを入れても問題ないが、タグ({% ... %}
)でフィルターを使う場合にはエラーとなる場合がある。
紛らわしいので、「フィルターを使うときは間のスペースなし」と決めておく方がよい。