【django】テンプレートとは:使用方法(templatesフォルダ・変数・タグ )

2021.04.05 /

【django】テンプレートとは:使用方法(templatesフォルダ・変数・タグ )

本記事では、Djangoにおけるテンプレート(templatesフォルダ・変数・タグ・フィルター)について詳しく解説していきます。

テンプレートはただ単にtemplatesフォルダを作って、HTMLを書いたファイルを保存するだけではないです。

テンプレートを使いこなすことができると、Webアプリケーション作成の幅が非常に広がります。

views.py側で文字列を指定してHTML作成もできますが、基本的にはテンプレートを利用します。

本記事を通して、テンプレートに対する知識をより深めてください。

テンプレート(Template)

テンプレートとは

Djangoでは、テンプレートという仕組みを使ってHTMLを生成し、Webページを表示させることができます。

テンプレートのフォーマットはHTMLなので、今までWebサイトを作成した経験がある方には馴染みのある形で作成できます。

またテンプレートの特徴の一つとして、views.pyから渡されるオブジェクトをHTMLに反映させ動的にHTMLを生成できます。

views.pyからは「コンテキスト」と呼ばれる変数と値がマッピングされたオブジェクトが渡されます。

def index(request):
    books = Book.objects.all()
    context = {"books": books,}
    return render(request, "index.html", context)

上記では変数名がbooks、値(リスト)がリストbooksのcontextがrenderメソッドでテンプレートに渡されています。

テンプレートではコンテキストに格納された変数にアクセスすることで値を取得し、HTMLに反映させることができるのです。

つまり、
テンプレートはHTMLでベースを書いておき、ビューから渡されたデータを反映させて、動的にHTMLを生成できるということです。

コンテキスト以外にも以下に記す変数をテンプレートでは利用できます。

  • request:リクエストオブジェクト
  • user:ユーザー情報
  • perms:ユーザーの権限
  • messages:フラッシュメッセージ

テンプレートの機能

Djangoのテンプレートを利用することで以下3つの機能を使用できます。

  • 変数に格納された値・文字列の表示
  • 変数の内容を変更して表示(フィルター)
  • 条件分岐やループなどのロジックの組み込み(タグ)

これら3つの機能は本記事の後半で解説しております。

テンプレートエンジン(DjangoTemplates)

テンプレートを使用するために、テンプレートエンジンのDjangoTemplatesを利用します。
これはsettings.py内のTEMPLATESに以下のように設定されています。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

BACKENDにはテンプレートエンジンを指定します。

ここで重要なのがDIRSとAPP_DIRSの2つです。

DIRSにはテンプレートの検索対象とするフォルダをリストで指定します。
例えばプロジェクト直下(manage.pyがある階層)にtemplatesフォルダを作成し、そこに保存したテンプレートを利用したい場合は次のように設定します。

'DIRS': [BASE_DIR / 'templates'],

BASE_DIRはプロジェクト直下の階層を示しています。詳しくは以下記事をご参照ください。

APP_DIRSには各アプリケーション内のtemplatesフォルダをテンプレートの検索対象にするかを指定します。

Trueにすると、アプリケーション内のtemplatesフォルダを検索対象にします。

つまりTrueにすることでDjangoTemplatesはsettings.py内のINSTALLED_APPSに記載あるアプリケーションからtemplatesフォルダを探索するということです。

templatesフォルダ

templatesフォルダの作成

テンプレートを保存するための場所として、アプリケーションフォルダにtemplatesフォルダを作成します。

次に作成したtemplatesフォルダの直下にアプリケーション名と同じ名前のフォルダを作成します。そしてそのフォルダ内にテンプレートを保存します。

アプリケーションfive、テンプレート名index.htmlの場合は次のような階層構造となります。

five
└── templates
   └── five
      └── index.html

templatesフォルダ内にアプリケーション名のフォルダを作成するのにはもちろん理由があります。

DjangoTemplatesは異なるアプリケーションの中に同じファイル名のテンプレートがあった場合、それらを区別・判別することはできないです。

DjangoTemplatesがそれらを区別できるよう、名前空間を与えるためにアプリケーション名のフォルダを作成しているのです。

Djangoテンプレート言語

テンプレートでは「views.pyから渡された変数に格納された値・文字列の表示機能」や、「繰り返しや条件分岐などのロジック制御をするタグ機能」、「変数の内容を変更して表示するフィルター機能」を利用できます。

それぞれの機能の概要を見ていきましょう。

変数(variable)

テンプレートエンジンDjangoTemplatesはテンプレート内に変数を見つけると、変数を値に変換します。
変数は”{{”と”}}”で囲んで使用します。

{{ 変数 }}

タグ(ブロックタグ:block tag)

タグは、繰り返し(for文)や判定(if文)といった処理や、テンプレートの継承で使用されます。

タグは”{%”と”%}”で囲んで使用し、開始タグと終了タグの2つを必要とするタグもあります。

構文

{% タグ %}

テンプレートのタグについて詳しくは以下記事をご参照ください。

ここではよく利用する3つのタグをご紹介します。

for

forタグを使うことで、繰り返し処理を行うことができます。

{% for list in lists %}
    <p>{{ list }}</p>
{% endfor %}

if, else

ifタグを使って、真・偽の判定を行い、真であればifタグ以下の処理を行います。
偽であれば、else以下の処理を行います。

{% if athlete_list %}
    <p>真です</p>
{% else %}
    <p>偽です</p>
{% endif %}

block

blockタグは、テンプレートの継承を行う際に使用します。

フィルター

フィルターとはviews.pyから受け取った変数を加工する仕組みです。

Djangoでは初めから様々なフィルターが用意されており、利用することで変数を柔軟に変更できます。

変数の文字列長を表示するフィルターや、指定した日時にフォーマットするフィルター、改行文字をHTMLのbrタグに変換するフィルターなど多種多様です。

フィルターについて詳しくは以下記事をご参照ください。

テンプレートの継承

テンプレートには全ページで共通する部分を1つのテンプレートにまとめ、その他のテンプレートで共通部分に関しては共通テンプレートを使用する仕組みがあります。
この仕組みをテンプレート継承と呼びます。

主にヘッダーやメニューバー、フッター、jQueryなど共通する部分を共通テンプレートに記載します。

Djangoでテンプレートを利用するうえでほぼ必ず利用する機能の1つです。

テンプレートの継承について詳しくは以下記事をご参照ください。

まとめ

本記事「【django】テンプレートとは:使用方法(templatesフォルダ・変数・タグ )」はいかがでしたか。

Djangoにおいてテンプレートは意外と理解が難しい部分なので、わかりやすく説明したつもりです。

本サイトOffice54ではその他にも有益な記事を日々アップしています。ぜひWebアプリケーション作成の参考にしてください。