入門クラス

【Django】テンプレートフォルダについて

テンプレートフォルダは、私が作った造語です。

要は、テンプレートを探索するフォルダの事を指します。

本稿ではデフォルトのテンプレートフォルダと自分が設定するテンプレートフォルダの設定方法を解説します。

テンプレートフォルダとは

まずは、テンプレートフォルダの説明をします。

はじめに抑えておきたいポイントとして、Djangoがテンプレートを探すフォルダは決まっている、ということです。

テンプレートをどこに配置しても読み込まれるわけではない、ということです。

ある特定のフォルダ内のみ探索します。

そのフォルダのことを「テンプレートフォルダ」と呼んでいます。

デフォルトのテンプレートフォルダ

テンプレートフォルダはクラスベースビューにおいてデフォルトで探索するフォルダがあります。

もちろんカスタマイズもできるのですが、デフォルトで問題ないと思います。私はデフォルト運用して困ったことはありません。

クラスベースビューの探索フォルダはアプリケーション単位で指定されます。

アプリケーションフォルダ内の以下のフォルダが探索フォルダです。

templates

とてもシンプルですね。

しかし実際クラスベースビューはこのtemplatesフォルダを探索します。

さらにその中にモデル名のフォルダを作成してそこを探索するようになっています。

例えば、モデル名がArticleであれば、以下のフォルダを探索します。

article/templates/article/

モデル名をすべて小文字にしたフォルダ内を探索します。Viewが関連するのにモデル名です。

テンプレートフォルダを追加する

では、トップページのテンプレートなどどこのアプリケーションにも属さないファイルはどこに保存するのが良いのでしょうか。

こういった場合、私はテンプレートフォルダをひとつ増やし、そこに納めています。

例外的なViewなどもありますので、そういったファイルをひとつのフォルダにまとめてしまいます。

プロジェクトフォルダ直下にlibというフォルダを作り、そこにいろいろ入れます。

もちろん、templatesフォルダもそのひとつです。

つまり、以下のようなフォルダを作成します。

lib/templates

そして、ここにあるtemplatesフォルダを探索するように設定ファイルに記述します。

テンプレートに関する設定ですので、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',
            ],
        },
    },
]

おそらく、デフォルトでこのようになっていると思います。

この辞書TEMPLATESが内用するキーDIRSはリストになっていて、開発者が探索したいフォルダをここで指定します。ここにフォルダを追加することで、いくつでもテンプレートフォルダを増やすことが可能です。

では、実際にlib/templatesを追加してみましょう。

TEMPLATES = [
    {
        ...
        'DIRS': [
			BASE_DIR / 'lib' / 'templates',
			# こちらでもOK
			# os.path.join(BASE_DIR, 'lib', 'templates'),
		],
		...
    },
]

このように、パスを設定してあげればOKです。

これで、このlib/templatesにテンプレートファイルを保存しておけば使用されるようになります。

意外と簡単だったのではないでしょうか。

注意点

テンプレートフォルダを作成する際にひとつ注意があります。

それは、クラスベースビューなどでデフォルト設定されているテンプレートフォルダと新しく作成したフォルダは同様に扱われるということです。

つまり、上記の例のようにArticleアプリケーションが存在するとして、クラスベースビューであれば以下のフォルダをデフォルトで探します。

article/templates/article

ここまでは通常の動作ですね。

しかし、ここで新たに作成したlibフォルダに同様のフォルダを作成するとどうなるでしょう。

lib/templates/article

もちろん、こちらも同様にテンプレートフォルダとして扱われる事になります。

これらのフォルダに同じ名前のテンプレートファイルがあった場合はどちらが使用されるでしょうか。

Djangoはテンプレートフォルダを探索して、最初に見つかったファイルを使用します。

ということは、こうなるとどちらのテンプレートが使用されるかわからない、ということになります。

こういった事態を防ぐために、一定の基準で作成するフォルダを決めておく必要があります。

私の場合は、アプリケーションで使用するテンプレートはアプリケーションのフォルダに保存して、それ以外はlibフォルダを作成して保存します。

ひとによってはlibフォルダかそれに準ずるフォルダを最初に作成して、そこにすべて保存し、アプリケーション内にtemplatesフォルダは作成しない、という人もいます。

それぞれ納得する理由があり、どちらがいいとは言えません。

しかし、チーム開発する際は基準を設定しておくことをオススメします。

また、個人開発の際も基準を持っておくと久しぶりのプロジェクトを更新するときに役立ちます。

-入門クラス
-