組み込みタグ

組み込みタグ

Djangoは組み込みタグと呼ばれるコードのようなものを提供しています。
それをHTMLファイルに組み込むことでループや条件分岐等を使うことが出来ます。
そうすることで同じようなコードを重複して書くことを防ぎ、効率的に開発を進めることが出来ます。

load, block, includeはこの記事とは別で紹介します。

組み込みタグの種類

autoescape

autoescapeは引数on, offで自動エスケープを制御します。


{% autoescape on %}
    {{ body }}
{% endautoescape %}

comment

commentは{% comment %} ~ {% endcomment %}で囲まれた部分をコメント化出来ます。
コメントを付けることも出来ます。


<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

csrf_token

csrf_tokenはクロスサイトリクエストフォージェリ (CSRF) 対策使われます。
HTMLのformタグでPostメソッドを使うときに使われます。


<form method="post">{% csrf_token %}

debug

debugはコンテキストやimportされたモジュールなどを含んだデバッグ情報を出力します。

extends

extendsは親テンプレートを継承します。


{% extends "base.html" %} 

firstof

firstofは1個目の引数がTrueのものを表示させます。


{% firstof var1 var2 var3 %}

下記と同じです。


{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

for

forはfor文を埋め込むことが出来ます。


<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

もちろん辞書型も使えます。


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

for ... empty

for ... emptyはリストが空、もしくはなかった場合に、表示させるものを指定します。


<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

if

ifはTrueのときブロックの内容を出力します。


{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

ifchanged

ifchanged前回のループ実行時と比べ、変わっているときだけ表示します。


<h1>Archive for {{ year }}</h1>

{% for date in days %}
    {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
    <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
{% endfor %}

lorem

loremはランダムな"lorem ipsum" のラテン語テキストを表示させます。


{% lorem %}

now

nowは指定したフォーマット文字列にしたがって現在の日付や時刻を表示します


It is {% now "jS F Y H:i" %}

spaceless

spacelessはブロック内の HTML タグ間にある空白文字を除去します。タブ文字や改行も含みます。


{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

上記は下記になります。


<p><a href="foo/">Foo</a></p>

templatetag

templatetagはテンプレートタグの構文で使われる文字を、通常の文字として出力します。


{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

url

urlはビューとオプションの引数を指定して、これとマッチする絶対パスへの参照 ( ドメイン部分を除いた URL ) を返します。


sample_app/urls.py

from django.urls import path
from . import views

app_name = 'sample_app'
urlpatterns = [
    path('', views.news_list, name='news_list'),
    path('news/<int:pk>', views.news_detail, name='news_detail'),
]

上記のようなurls.pyがあったとします。
それぞれのURLのリンクを貼るには


<a href="{% url 'sample_app:news_list'  %}">Topページに戻る</a>

<a href="{% url 'sample_app:news_detail' news.pk %}">{{ news.title }}</a>

verbatim

verbatimはブロック内でテンプレートエンジンによる解釈を行いません。

これは JavaScript テンプレート の文法が Django と衝突してしまう時によく使われます。


{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

最後に

今回紹介した組み込みタグ以外にも組み込みタグはあります。
load, block, include、この3つの組み込みタグは別途紹介させていただきます。