「Djangoのプロジェクトとアプリケーションについての補足」
まったくDjangoをさわっていなかったかたのために補足しておきます(公式チュートリアルと上村さんの資料をこなせば理解できることですが)。
DjangoのWebサイト開発には、「サイト単位のプロジェクト」と「機能を持ったアプリケーション」が登場します。
「サイト単位のプロジェクト」は主にサイトの設定を受け持ちます。データベース等のプロジェクト毎にするl設定と、どのアプリケーションを利用するかの設定、国際化を利用するかどうかの設定等様々です。
「機能を持ったアプリケーション」はある領域に特化した機能の実装を受け持ちます。データをデータベースから取り出したり、操作したりといった機能です。アプリケーションによっては、データベースを扱わずブラウザからの入力値を改変するだけのものもあります。
Djangoには標準でユーザ管理やセッション管理といったアプリケーションが付属しており、プロジェクトを開始した時点でいくつかのアプリケーションがプロジェクトに設定されます。
実は、標準で付属しているアプリケーションと独自に開発するアプリケーションの間には何の差異もありません。つまり、ありがちな機能に関してはアプリケーションをプロジェクトで使う設定をするだけで再利用ができるのです。
と、ここで重要になってくるのは「機能は同じでも見た目は変えたい」という欲求にどう対処するのか?ということです。
Djangoは「アプリケーションの直下にあるtemplatesというディレクトリをテンプレートの探索起点にする」というテンプレートローダがあらかじめプロジェクトに設定されています。プロジェクトにはもう一つ、プロジェクトの設定ファイル(settings.py)のTEMPLATE_DIRSというタプルに設定されたディレクトリも探索の起点とするというテンプレートローダも設定されています。djangoはテンプレートを探す時、設定された順にテンプレートローダを使い、最初に発見したテンプレートを利用します。
上村さんがサンプルにしたpinaxは、各アプリケーション毎にはtemplatesディレクトリが無く、pinaxとしての見た目がプロジェクト直下のtemplatesディレクトリに格納されています。pinaxのサンプルプロジェクトcompleteの直下のtemplatesディレクトリには各アプリケーション用のテンプレートが格納されています。ですから、「complateに入っているアプリケーションをbasicにコピーしただけでは、テンプレートが見つからずにエラーとなる」のです。
ちなみに、アプリケーションは必ずしもプロジェクトの下に置く必要はなく、Djangoのプロジェクトを実行しているPythonから見つかる場所にあれば動作します。コードベース1つで、複数のプロジェクトから見た目を変えて利用するといったことも可能です。