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

Django

djangoのテンプレート組込タグを紹介します。

簡単なサンプル付きですが、
タグの数が多いので3部に分けています。

今回は2部目(”for” 〜 “now”)までです。

for

配列内の各要素をループし、見つかった各要素を変数として使用します。

サンプル(bandukehyo= [‘横綱’, ‘大関’, ‘関脇’, …]とした場合)

{% for banduke in bandukehyo %}
    {{ banduke }},
{% endfor %}

出力
 横綱 大関 関脇 ...

逆ループしたい場合は、{% for obj in list reversed %}とする。

リストのリストのループ処理も個別に名前を割り当てることが可能。
points = [[ 1 , 2 ],[ 3 , 4 ],[ 5 , 6 ]]とした場合

{% for x,y in points %}
    {{x}},{{y}}
{% endfor %}

出力
>> 1,2 3,4 5,6

また、辞書の各要素を出力したい場合も便利です。

data ={‘one’:1, ‘two’:2, ‘three’:3}とした場合

{% for key, value in data.items %}
    {{key}}:{{value}}
{% endfor %}

出力
>> one:1 two:2 three:3

ここで辞書方を使用するならdata.”items“が必要です。
この items がないと出力されません。

forループに関する変数は以下のものがあります。

変数説明
forloop.counter現在のループカウンタ番号(1からカウント)
forloop.counter0現在のループカウンタ番号(0からカウント)
forloop.revcounter現在のループカウンタ値(1から順に、末尾からカウント)
forloop.revcounter0現在のループカウンタ値(0から順に、末尾からカウント)
forloop.first最初のループであればTrueを出力
forloop.last最後のループであればTrueを出力
forloop.parentloop入れ子のループである時、現在のループを囲んでいる 1 つ上のループを出力

forloop.parentloopがわかりにくいため、簡単なサンプル。
要素3つのdata のforループの中に datachild=[10,11,12]があるとする。
forloop.parentloopを使えば、同時に1つ上のループを出力できる

{% for i in data %}
  {% for j in datachild %}
    {{forloop.parentloop.counter0}}:{{ j }}, 
  {% endfor %}
{% endfor %}

出力
0:10, 0:11, 0:12
1:10, 1:11, 1:12
2:10, 2:11, 2:12

for … empty

for タグのオプションとして {% empty %} があります。

これはループさせようとした配列が空
または存在しなかった場合に表示する文字列を指定します。

dicts = { }とする空の辞書だった場合、以下のようになります。

{% for dict in dicts %}
    {{ dict.name }}
{% empty %}
    "要素がありません"
{% endfor %}

出力
 要素がありません

if

{% if %} タグは変数を評価し、その変数が “true” であるとき 、
つまり変数が存在し、空ではなく、その値が False でないときにブロックの内容を出力します。

サンプルとしてdata = [ 1, 2, 3 ]がある場合

{% if data %}
  データの数: {{ data|length }}
{% elif fake_data %}
  これはフェイクデータです。
{% else %}
  データはありません。
{% endif %}

出力
 データの数: 3

このサンプルでは最初のif文がTrueになるため
data|lengthによってdataの要素数が出力されます。

またif文には論理演算子として”and” “or” “not”
比較演算子として”==”, “!=”, “<“, “>”,
“<=” , “>=” , “in”, “not in” , “is”が使用できます。

それぞれのサンプルと意味を簡単に

演算子意味
a == ba が b と等しい
(a, b の値が同じか判断)
a != ba が b と異なる
a < ba が b より小さい
a > ba が b より大きい
a <= ba が b 以下
a >= ba が b 以上
a is ba が b と等しい
(a, bのidが等価か判断)
a is not ba が b と異なる
a in ba が b に含まれる
(a, b は共に文字列、または b はリストやタプル)
a not in ba が b に含まれない
(a, bは共に文字列、または b はリストやタプル)

if文の中でフィルターを使用した場合
サンプルとしてdata = [ 1, 2, 3 ]とした場合

{% if data|length >= 2%}
  データの数は2以上で {{ data|length }}コです
{% else %}
  データの数は2コ未満です。
{% endif %}

出力
 データの数は2以上で 3コです

複数の演算子がある場合、優先順位の規則があります。

優先順位演算子
1== , != , < , > , <= , >=
2in
3not
4and
5or
{% if a == b or c == d and e %}

->優先順位の規則として
 (a == b) or ((c == d) and e)

ifequal と ifnotequal

{% ifequal a b %}~{% endifequal %}は
{% if a==b %}~{% endif %}と同じ意味であり

{% ifnotequal a b %}~{% endifnotequal %}は
{% if a != b %}~{% endif %}と同じ意味になります。

これはあまり使わないので重要ではないです。

ifchanged

値が前回のループ実行時から変わっているかどうかを確認します。
変化があった場合、その変化を出力します。

公式サイトと同様に日付の一覧を表示する際
月に変更があった場合、月も表示するサンプルです。

def main(request):
    d = datetime.date(2021, 2, 27) #基準日
    td = datetime.timedelta(days=1) #tdに1日を設定
    days = []
    for i in range(5):
        days.append(d + i * td) #基準日から5日間をdaysに入れる
    context = {'days':days}
    return render(request, 'sample.html', context)
{% for date in days %}
  {% ifchanged %}{{ date|date:"F" }}{% endifchanged %}{{ date|date:"j" }}日
{% endfor %}

出力
 2月27日 28日 3月1日 2日 3日

もしくは{%ifchanged ~~}の中の~に1つ以上の変数を入れて
その変数がすべて変化した際に出力できます。

また、{% else %}も使用可能です。
これは値に変化がないときに表示されます。

以下にサンプルとして同じ出力となるサンプルを示します。

{% for date in days %}
  {% ifchanged date.month %}{{ date|date:"F" }}{{ date|date:"j" }}日
  {% else %}{{ date|date:"j" }}日
  {% endifchanged %}
{% endfor %}

include

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

テンプレート名は引用符で囲った文字列でもよく
引用符は一重引用符 (’…’)でも二重引用符(”…”)でもかまいません。
テンプレート上の変数も引継ぎます。

サンプルとして、test = ‘テスト’とし
test.htmlをsample.htmlに引き継いだ場合

test.htmlです
{{test}}
{% include "test.html" %}

出力
 test.htmlです
 テスト

load

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

例えば、tamplatetagsフォルダの中にカスタムの
テンプレートタグとして”sample_tag.py”を作成した場合

{% load sample_tag %}

でタグを使うことになります。

画像やCSSなどの静的ファイルを利用する場合も
{%load ~~%}を使います。

lorem

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

こんな感じのテキストができます。

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

{% lorem %}には3つの引数があります。
[count] [method] [random]の3つがあります。

countは1~3で変数を取り、単語や段落の数が変わります。
methodはw, p, bの変数を取り、wでは単語を
pの時はHTMLの段落ブロック、bはテキストの段落ブロックを生成します。
randomはrandomのみを変数とし、別のテキストを生成します。

now

{% now %}はこのままでは使用できません。
指定したフォーマット文字列にしたがって
現在の日付や時刻を表示するため、フォーマット文字列が必要です。

{% now "Y/m/d H:i" %}

出力
 2021/03/16 18:38

このフォーマット文字列に関してはまた後述します。

django テンプレート組込タグ 続き

djangoテンプレートの組み込みタグ3部中の
2部目(“for” 〜 “now”)でした。

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

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

3部目は後述します。

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