Django – テンプレートの基礎

概要

HTMLや埋め込まれたデータを含むテンプレートを使ったアプリケーションの基本。流れは以下の通り。

  • テンプレートを表示させるアプリケーションの作成と登録
  • テンプレートを保存するディレクトリーとテンプレートファイルの作成
  • テンプレートを呼び出すビュー関数の作成
  • ルーティング設定

ここでは以下のことを整理している。

  • テンプレートの配置場所
  • テンプレートの参照方法
  • テンプレート言語(DTL)の概要

関連記事

プロジェクトの準備

プロジェクトディレクトリーをtemplatebasicsとし、settings.pyなどを含むサブディレクトリーをconfigとする。

初期設定とサーバー起動で動作確認しておく。

アプリケーションの作成・登録

テンプレートを表示させるアプリケーションtemplatedemoを作成する。

そしてアプリケーションをsettings.pyINSTALLED_APPSに追加登録する。

テンプレート配置

初期設定

テンプレートの配置場所settings.pyTEMPLATESで設定する。

DIRSは任意の場所・ディレクトリー名のパスを設定する。またAPP_DIRTrueに設定すると、各アプリケーションディレクトリー下のtemplatesディレクトリーが探索される。

複数のテンプレートディレクトリーは一括して同列に扱われ、各ディレクトリーのサブディレクトリーも再帰的に探索される。

デフォルトの設定では、各アプリケーションディレクトリー下のtemplatesディレクトリーのみが対象となっている。

配置場所

ここでは、以下の場所にテンプレートディレクトリーを置いて設定していく。

  • 2か所にテンプレートディレクトリーを配置し、いずれのファイル名ともindex.htmlとしている
  • プロジェクト直下のディレクトリー名は任意だが、簡明のためtemplatesとする
  • 2つのテンプレートディレクトリーは併せて参照されるので、アプリケーション下の方は区別のためにサブディレクトリーを設けている

アプリケーション下

テンプレートディレクトリー作成

作成したアプリケーションディレクトリーtemplatedemoの下にtemplatesディレクトリーを作成し、その下に更にサブディレクトリーtemplatedemoを作成する。

テンプレートファイル作成

作成したサブディレクトリー下にindex.htmlファイルを作成して以下を記述。

プロジェクト直下

settings.py編集

TEMPLATESDIRSにプロジェクト直下のtemplatesディレクトリーを探索するよう追加。

os.pathを使う方法もありその場合はimport osが必要になるが、上記の記述でも同じ効果。

テンプレートディレクトリー作成

プロジェクトディレクトリー直下にtemplatesディレクトリーを作成する。サブディレクトリーは作成しない。

テンプレートファイル作成

作成したtemplatesディレクトリー下にindex.htmlファイルを作成して以下を記述。

view関数の作成とルーティング

view関数の作成

アプリケーションディレクトリーtemplatedemoviews.pyを編集して、view関数を定義する。

view関数でレンダリングするテンプレートを指定するため、プロジェクト直下とアプリケーションディレクトリー下2か所のテンプレートに対応する関数を記述している。要点は以下のとおり。

  • def 関数名(request):で定義
  • テンプレートを呼ぶ戻り値はrender関数
    • 第1引数は受け取ったrequest
    • 第2引数はテンプレートファイルのパス
  • テンプレートファイルのパスについて
    • TEMPLATESで設定したすべてのテンプレートディレクトリー下が一括して扱われる
    • テンプレートディレクトリー以下の相対パスとする

複数テンプレートディレクトリーが一括して扱われ、テンプレートの指定がテンプレートディレクトリーからの相対パスとなるため、サブディレクトリーを設定した意義が確認できる。

view関数のルーティング登録

これらのview関数をURLから呼び出すためurls.pyに記述を追加する。

確認

ここで開発用Webサーバーを起動して、ブラウザーで以下の入力に対応したページが表示されるのが確認できる。

  • localhost:8000/project
  • localhost:8000/application

DTL~テンプレート言語

概要

テンプレートにはHTMLのほかに、view関数から受け取った変数を埋め込んだり、繰り返しや条件分岐による出力の変更といった制御をさせることができる。そのための言語をDTL (Django Template Language)と言う。

  • {{ 変数 }}:変数の内容を展開してHTMLに埋め込む
  • {% 文 %}forendforによるループやifelifendifによる条件分岐で出力を制御する

変数の展開

たとえばtemplatedemoアプリケーションのviews.pyで、index_application関数を以下のように変更する。

ここでは、変数textを定義して、これを'text'をキーとする辞書の値としてrender関数の第3引数に渡している。

次に、templatedemoアプリケーション下のindex.htmlテンプレートを以下のように変更する。

表示結果は、ブラウザーの上部またはタブと見出しに同じ「アプリケーション下」が表示される。

このように、ビュー側で処理した結果を変数としてテンプレートに渡し、HTMLとして表示させることができる。

制御構造

先のindex_application関数を以下のように変更する。

ここでは第3引数をcontextとし、この変数に2つの要素を持つ辞書を入れている。1つ目の要素はタイトル、2つ目の要素は物語のシーンを収めた配列としている。

これを受け取るindex.htmlを以下のように変更する。

scenesで渡された配列の要素を、DTLのforendforでループしながら取り出し、li要素として並べている。この結果、出力されたHTMLでは5つのシーンがリストとして表示される。

同じテンプレートを使って、タイトルとシーンを桃太郎やかぐや姫などと変化させることができる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です