djangoのテンプレート組込タグを紹介します。
簡単なサンプル付きですが、
タグの数が多いので3部に分けています。
今回が最後の3部目です。
最後の3部目(”regroup” 〜 “with”)までです。
regroup
オブジェクトのリストから同じ属性値を持つ
オブジェクトのグループを作ります。
このregroupは3 つの引数を持ちます。
XXX:グループ分けを行うリスト
YYY:グループ分けに使う属性の名前
ZZZ:結果とするリストの名前
{% regroup XXX by YYY as ZZZ %}
サンプルとして以下のようなリストがあった場合
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'},
]
グループ分けを行うリスト(XXX)がcitiesとして
グループ分けに使う属性の名前(YYY)をcountry
結果とするリストの名前(ZZZ)をcountry_listとした場合
countryごとにグループを分けるコードは1行目のようになります。
{% 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>
このコードによる出力結果は以下になります。

ここでZZZとする結果となるリストには
2つのフィールド(grouper ,list)を持ちます。
上記の例だと以下のように書きます。
・country_list.grouper:グループ分けに使われた要素
India ,USA ,Japan
・country_list.list:このグループ内のすべての要素からなるリスト
{‘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→USA→India…のようになります。
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'},
]
しかし、この場合、テンプレートのフィルタ
dictsortフィルタを使用すると綺麗に並びます。
{% regroup cities|dictsort:"country" by country as country_list %}
resetacycle
前の[ cycle ]タグをリセットして
次の遭遇時に最初のアイテムから再開するようにします。
例えば、somelist=[1,2,3]とし、somelist2=[1,2]の場合
{% for j in somelist2 %}
{% for i in somelist %}
<div class="{% cycle 'row1' 'row2' %}">
No.{{ j }}は {% cycle '奇数' '偶数'%}
</div>
{% endfor %} {% resetcycle %}
{% endfor %}
上記の出力は以下のようになります。
No.1は 奇数 No.1は 偶数 No.1は 奇数
No.2は 奇数 No.2は 偶数 No.2は 奇数
{% resetcycle %}があるため
No.2の最初が奇数となり、リセットされました。
これが {% resetcycle %}がない場合だと
出力結果は以下のようになります。
No.1は 奇数 No.1は 偶数 No.1は 奇数
No.2は 偶数 No.2は 奇数 No.2は 偶数
spaceless
ブロック内の HTMLタグ間にある空白文字を除去します。
タブ文字や改行も含みます。
タグとテキストの間の空白は消しません。
以下にサンプルを示します。
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
<strong>テキスト</strong>
{% endspaceless %}
このサンプルは以下と同じ意味になります。
<p><a href="foo/">Foo</a></p>
<strong>テキスト</strong>
templatetag
テンプレートタグの構文で使われる文字を通常の文字として出力します。
Django のテンプレートには “エスケープ” の概念がないため
テンプレートタグで使われる文字を出力させるには
{% templatetag %} タグを使わねばなりません。
Argument | 出力 |
openblock | {% |
closeblock | %} |
openvariable | {{ |
closevariable | }} |
openbrace | { |
closebrace | } |
opencomment | {# |
closecomment | #} |
url
ビューとオプションの引数を指定して
これとマッチする絶対パスへの
参照 ( ドメイン部分を除いた URL ) を返します。
追加の引数はオプションであり
URLの引数として使用されるスペースで
区切られた値である必要があります。
オプションとなる引数の中で固定引数の場合
{% url 'some-url-name' v1 v2 %}
上記のように書きます。
また、オプションの引数がキーワード構文の場合
{% url 'some-url-name' arg1=v1 arg2=v2 %}
となります。
ここで注意としては1回の呼び出しで
固定構文とキーワード構文の両方を混在させないことです。
例えば、projectのurls.pyに下記のように示してあり
path('clients/', include('project_name.app_name.urls'))
applicationのurls.pyには下記が書かれていた場合
path('client/<int:id>/', app_views.client, name='app-views-client')
<int:id>を埋めるため、テンプレートには
下記のように固定構文の記述が必要です。
{% url 'app-views-client' client.id %}
これでURLが”/clients/client/123/”のようになります。
verbatim
テンプレートエンジンがこのブロックタグの間にある
コンテンツをレンダリングしないようにします。
一般的な使用法はDjangoの構文と衝突する
JavaScriptの変数を許可することです。
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
widthration
棒グラフなどを生成する場合のために
指定した値と最大値との比を計算し
定数に掛けた値を返します。
<div style=“height:10px; width:{% widthratio this_value max_value max_width %}px;>
ここでthis_valueが指定した値
max_valueが最大値で
掛ける定数がmax_widthです。
this_valueとmax_valueで割合を出し
定数となるmax_widthをかけて定数の割合が出力されます。
max_widthが1であれば、パーセンテージになり
this_valueとmax_valueが同じ数値であれば
max_widthがそのまま出力されます。
with
複雑な表現の変数の値をキャッシュし
簡単な名前で参照できるようにします。
サンプルとして以下に示します。
{% with total=business.employees.count %}
{{ total }} employee {{ total|pluralize }}
{% endwith %}
totalにはbusiness.employees.countと
いう長い変数を入れて
{% with %} と {% endwith %} タグの
間のみtotalを有効としています。
django テンプレート組込タグ 続き
以上がdjangoテンプレートの組み込みタグ
3部中の最後(“regroup” 〜 “with”)でした。
1部目の”autoescape” 〜 “firstof”の組み込みタグの説明に
関してはこちら【django】テンプレート組込タグ一覧【1/3】

2部目の”for” 〜 “now”の組み込みタグの説明に
関してはこちら【django】テンプレート組込タグ一覧【2/3】
