(最終更新月:2022年2月)
✔このような方へ向けて書かれた記事となります
「Djangoのテンプレートタグって何?」
「テンプレートタグは何ができるの?」
「テンプレートタグの種類、概要が知りたい!」
✔当記事を通じてお伝えすること
- Djangoテンプレートタグとは?
- Djangoのテンプレートタグ一覧 25選
- 【26種の具体例】サンプルコード
Djangoテンプレートタグとは?
Djangoのテンプレートを使うメリットの一つは、通常のHTMLとは違い、テンプレート上で一定のプログラミングのコードが記述でき、処理する機能がつけられることにあります。
その処理する機能を埋め込むために、「テンプレートタグ」が使われます。
つまり、テンプレートタグを使うことによって、HTMLテンプレート上で、if文やfor文などプログラミング文が記述できるようになります。
書き方としては、{% タグ名 %}というように、「{%」「%}」に囲まれているのが特徴です。
例として、if文は下記のように記述します。
{% if 条件 %}
行いたい処理
{% endif %
公式サイトによるとifやfor文以外にも、テンプレートタグの種類は全部で25種類(2022年2月時点)です。
次章で全てを紹介しますので、何ができるのかを頭に入れておきましょう。
Djangoのテンプレートタグ一覧 25選
タグ名と簡単な説明をまとめています。
タグ名をクリックすると、次章のサンプルコードをご覧になれます。
タグ名 | 説明 |
---|---|
autoescape | on、offによりタグブロック内の自動エスケープを有効・無効にします。 |
block | テンプレートの継承後に書き換える部分を指定します。 |
comment | <!–コメントアウト–>と同様の役割です。 |
csrf_token | POSTメソッドでフォームを送信する際に指定します。 |
cycle | 引数や文字列が順番に出力されます。for文などで使われるケースが多いです。 |
debug | エラーの際などのデバックが表示されます。DEBUG=Falseの場合は何も出力されません。 |
extends | 親テンプレートを拡張することを宣言します。 |
filter | タグブロック内のコンテンツを指定したフィルタに通します。 |
firstof | 複数の値を引数として渡します。その中で最初に「True」が返る値を表示します。 |
for | forループをテンプレート上で作成します。 |
for … empty | emptyタグでは、forループの対象が空の時に表示する内容を指定できます。 |
if | テンプレート上で条件分岐を行います。 |
ifchanged | forループ内で使われ、前回のループ実行時から値が変化しているかを調べます。 |
include | 他テンプレートを読み込みます。 |
load | staticなどのテンプレートタグセットを読み込みます。 |
lorem | ランダムなラテン語テキストを表示させます。 |
now | 現在の日付や時刻を表示します。 |
regroup | 既存のオブジェクトリストから、新たなリストをオブジェクトグループを再構築します。 |
resetcycle | cycleブロック内で使用することで、cycleの最初の値へ強制的に戻ります。 |
spaceless | ブロック内のHTMLタグ間のスペースを除去します。タブや改行も同様に除去されます。 |
templatetag | テンプレートタグで使用されている文字を、通常の文字として出力する時に使います。 |
url | urls.pyで指定した「name」から、実際のURLを返します。 |
verbatim | JavaScriptテンプレートの文法がDjangoと衝突してしまう時に使われます。 |
widthratio | 指定した値と最大値との比を計算し、定数に欠けた値を返します。 |
with | ブロック内で使用できる変数を宣言します。 |
【25種の具体例】サンプルコード
autoescape
【views.py】
from django.shortcuts import render
def myapp_list_view(request):
html_string = "<p style='color:red;'>red font</p>"
ctx = {"want_to_escape": html_string}
return render(request, "myapp/myapp_list.html", ctx)
【autoescapeが「on」の時】
{% autoescape on %}{{ want_to_escape }}{% endautoescape %}
ブラウザでの表示↓
【autoescapeが「off」の時】
{% autoescape off %}{{ want_to_escape }}{% endautoescape %}
ブラウザでの表示↓
block
{% block %}{% endblock %}
comment
{% comment %}コメントアウトしたい文字列{% endcomment %}
csrf_token
<form method="POST">{% csrf_token %}
....
</form>
cycle
【views.py】
from django.shortcuts import render
def myapp_list_view(request):
ctx = {}
ctx["object_list"] = ["python", "javascript", "html", "css"]
return render(request, "myapp/myapp_list.html", ctx)
{% for obj in object_list %}
<div style="color: {% cycle 'green' 'blue' %};">{{obj}}</div>
{% endfor %}
ブラウザでの表示↓
debug
{% debug %}
extends
{% extends 'base.html' %}
filter
全て大文字に変換する「upper」フィルタを使う例です。
{% filter upper %}
i like to study python and django
{% endfilter %}
ブラウザでの表示↓
firstof
テンプレートへ渡されているコンテキストが下記のとおりとします。
ctx = {
"first_variable": "",
"second_variable": "",
"third_variable": "firstofのテスト"
}
HTMLテンプレート上で下記のように記述します。
{% firstof first_variable second_variable third_variable "Nothing is stored" %}
ブラウザでの表示↓
下記と同様の内容になります。
{% if first_variable %}
{{ first_variable }}
{% elif second_variable %}
{{ second_variable }}
{% elif third_variable %}
{{ third_variable }}
{% else %}
Nothing is stored.
{% endif %}
for
{% for obj in object_list %}
{{ obj }}
{% endfor %}
for…empty
{% for obj in object_list %}
{{ obj }}
{% empty %}
リストは空です。
{% endfor %}
if
{% if 条件1 %}
...
{% elif 条件2 %}
...
{% else %}
...
{% endif %}
ifchanged
{% for obj in object_list %}
{% ifchanged obj.date %}日付が変わりました{% endifchanged %}
{% endfor %}
include
{% include 'myapp/another_template.html" %}
load
{% load static %}
lorem
{% lorem %}
now
{% now "Y F" %}
regroup
仮に下記のリストがコンテキストで渡されているとします。
people = [
{"name": "ダルビッシュ", "age": "35", "league": "USA"},
{"name": "大谷", "age": "27", "league": "USA"},
{"name": "前田", "age": "33", "league": "USA"},
{"name": "柳田", "age": "33", "league": "Japan"},
{"name": "山田", "age": "29", "league": "Japan"},
{"name": "森", "age": "26", "league": "Japan"},
]
regroupタグを使います。
{% regroup people by league as players %}
{% for player in players %}
<h2>{{ player.grouper}}</h2>
{% for p in player.list %}
<div>{{ p.name }}: {{p.age}}</div>
{% endfor %}
<hr />
{% endfor %}
ブラウザでの表示↓
regroupタグの構成は下記の通りです。
{% regroup 元のリスト by 基準にしたいキー名 as 新たなリスト名 %}
resetcycle
こちらは公式サイトからの抜粋になります。
https://docs.djangoproject.com/ja/4.0/ref/templates/builtins/#resetcycle
{% 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 %}
spaceless
{% spaceless %}
<div>
<div>
Test Sentence
</div>
</div>
{% endspaceless %}
templatetag
テンプレート上でコンテキストを使う場合は {% templatetag openvariable %} から始めましょう。
url
「index」はurls.pyで指定されたページ名です。
{% url 'index' %}
verbatim
こちらは公式サイトからの抜粋になります。
https://docs.djangoproject.com/ja/4.0/ref/templates/builtins/#verbatim
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
widthratio
こちらは公式サイトからの抜粋になります。
https://docs.djangoproject.com/ja/4.0/ref/templates/builtins/#widthratio
<img src="bar.png" alt="Bar" height="10" width="{% widthratio this_value max_value max_width %}">
with
{% with num=10 %}
{{ num }}
{% endwith %}
まとめ
当記事の内容をまとめます。
Djangoテンプレートでは、テンプレートタグを使うことによって、if文やfor文などプログラミング文が記述できるようになります。
2022年現在でのテンプレートタグは全部で25種類です。
もう一度見てみたい方はこちらから一覧表へ戻れます。
改めて見てみると「こんなこともできるんだ!」と驚いた方も多いはずです。
是非必要な度に見返して、皆さんのWebアプリ開発のお役に立てれば幸いです。
✔ウェブアプリを公開したい方へのおすすめ記事