【django】テンプレート組込タグ一覧【3/3】

Django

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】

【django】テンプレート組込タグ一覧【1/3】
djangoのテンプレート組込タグを紹介します。組込タグを紹介しているサイトは多いですが、サンプル付きでまとまったものがないため、作りました。タグの数が多いので3部に分けています。今回は1部目"autoescape" 〜 "firstof"を紹介します。

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

【django】テンプレート組込タグ一覧【2/3】
djangoのテンプレート組込タグを紹介します。組込タグを紹介しているサイトは多いですが、サンプル付きでまとまったものがないため、作りました。タグの数が多いので3部に分けています。今回は2部目"for" 〜 "now"を紹介します。

タイトルとURLをコピーしました