投稿日:2019年11月19日
DjangoでWebアプリケーションを作成する際には、多くの場合でtemplate機能を使用します。では、皆さんはどのようにDjangoのtemplateを分けていますか?この記事ではオススメのtempalte管理方法について解説します。
Djangoではtempalteディレクトリの置き方について、細かい決まりなどはないのですが、チュートリアルなどでよく推奨される方法が管理方法として良くないのでは?と言われることがしばしばあります。
この記事では推奨される置き方のどこに問題があるのか、そしてどのような置き方をすると良いのかについて解説します。
※ここで紹介する方法はあくまで管理方法の提案の一つです。
まずはDjangoのチュートリアルなどでよく見る置き方をみてみましょう。
これはサイト全体で使用するtempalteのディレクトリをプロジェクトのルート直下に、それぞれのアプリケーションで使用するtemplateファイルはそのアプリケーションのサブディレクトリで管理する方法です。
例えば下の様なディレクトリ構造になるでしょう。
sample_proj/
├── blog
│ ├── templates
│ │ └── blog
│ │ ├── article_detail.html # ルートのbase.htmlをextendsしている
│ │ └── article_list.html # 同上
│ ︙
├── contact
│ ├── templates
│ │ └── contact─…
│ ︙
├── manage.py
├── sample_proj
│ ︙
└── templates
└── base.html
Djangoはそもそもアプリケーションの再利用が前提の設計になっています。確かにDjangoが推奨するこのようなディレクトリ構成にしておけばどれかのアプリケーションを他のプロジェクトにそのまま持って行っても問題なく動いてくれるでしょう。
しかし...管理のしやすさという面ではどうでしょう?
一つのページの中に複数の機能を入れたテンプレートファイルを改修する時は?
この構成だと、きっとフロントをコーディングする間中、いろんなディレクトリを行ったりきたりすることに...
それはなんとしても避けたいはず!!!
ということでこれを解決するオススメの管理方法は...
『ルートのtemplatesディレクトリの中に全部入れちゃえ!』です。
簡単な解決方法ですね!ルートのtemplatesディレクトリにそれぞれのアプリケーションディレクトリを作成し、その中でtemplateファイルを管理します。ここで注意してほしいのがDjangoの検索対象です。デフォルトの設定では、アプリケーションのtemplatesディレクトリしか探してくれません。まずはこれを設定し直しましょう!!
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[...]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")], # 検索対象にルートのtemplatesを指定
'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のDIRキーの値に検索したい対象のパスをリストで定義して上げることでDjangoのtemplate検索対象に含めることができます。
では、ディレクトリ構造の中身に入ります。
ルートのディレクトリでの管理方法はさらに大きく2層構造と3層構造の2つのパターンに分けられます。
これはそれぞれのtemplateファイルが全てbase.htmlをextendsしている形です。どこにとんでもページのデザインの大半の部分が同じになるようなサイトの場合、これが適しているでしょう。
sample_proj/
├── blog/
│ ︙
├── comment/
│ ︙
├── manage.py
├── sample_proj/
│ ︙
└── templates
├── base.html # ほぼ全てのtemplateにextendsされる
├── blog/
│ ├── article_detail.html
│ └── article_list.html
├── comment/
︙
こちらはアプリケーションのアプリケーションそれぞれがbase.htmlをextendsしたbaseとなるtemplateファイルを持つ構成です。それぞれのbaseのファイル名は自由に決めて良いのですが、無難にbase_{アプリケーション名}.htmlという名前をオススメします。この構成はそれぞれの機能ごとにページのデザインが全く変わるようなWebアプリケーションに適しています。
sample_proj/
├── blog/
│ ︙
├── comment/
│ ︙
├── manage.py
├── sample_proj/
│ ︙
└── templates
├── base.html
├── blog/
│ ├── base_blog.html # base.htmlをextends
│ ├── article_detail.html # base_blog.htmlをextends
│ └── article_list.html # 同上
├── comment/
︙
Djangoの推奨するように再利用を前提に設計を考えて作成していくのはもちろん大切なことです。
しかし、設計を考えるあまり管理に気を病んでは本末転倒です。
そうならないように、
まずはtemplateはすべてルートディレクトリにまとめて管理して作成していき、本当にアプリケーションの再利用が必要になったとき、はじめてアプリケーションごとにディレクトリを分割する。
これが僕のオススメするtemplateのディレクトリの管理方法です。