テンプレートフォルダは、私が作った造語です。
要は、テンプレートを探索するフォルダの事を指します。
本稿ではデフォルトのテンプレートフォルダと自分が設定するテンプレートフォルダの設定方法を解説します。
テンプレートフォルダとは
まずは、テンプレートフォルダの説明をします。
はじめに抑えておきたいポイントとして、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
フォルダは作成しない、という人もいます。
それぞれ納得する理由があり、どちらがいいとは言えません。
しかし、チーム開発する際は基準を設定しておくことをオススメします。
また、個人開発の際も基準を持っておくと久しぶりのプロジェクトを更新するときに役立ちます。