Djangoで Jinja2導入のいろは

Djangoは最初からDjangoテンプレートが使えますが、GAE用のKayでJinja2テンプレートを使って以来Jinja2が手放せなくなってしまいました。


今回はDjangoでJinja2テンプレートを使う方法を簡単にまとめます。


※ 導入手順検証のため、virtualenv環境を使っていますが、virtualenv環境は必須ではありません。


1. 検証のため真っさらなvirtualenv環境を作成

mkvirtualenv --no-site-packages jinja2test

作ったvirtualenv環境に外部パッケージが導入されていないことを確認します。

pip freeze
distribute==0.6.27
wsgiref==0.1.2


2. DjangoとJinja2をインストール

pip install Django Jinja2

インストールが成功したことを確認します。

pip freeze
Django==1.4.1
Jinja2==2.6
distribute==0.6.27
wsgiref==0.1.2


3. django-jinjaパッケージをインストール

pip install django-jinja

(注) django-jinja2パッケージは別物です


くどいようですが、インストールが成功したことを確認します。

pip freeze
Django==1.4.1
Jinja2==2.6
distribute==0.6.27
django-jinja==0.3
wsgiref==0.1.2


4. Djangoプロジェクトを作る

django-admin.py startproject jin2prj


5. Djangoアプリを作る
django-admin.pyでアプリケーションを作ります。

cd jin2prj
django-admin.py startapp jin2app


プロジェクトに作ったアプリケーションを組み込むために、jin2prj/jin2prj/settings.pyのINSTALLED_APPSタプルに下記を追加します。

'jin2app',


6. テンプレートローダーの指定を入れ替える
jin2prj/jin2prj/settings.pyのTEMPLATE_LOADERSタプル内に'django_jinja.loaders.AppLoader'と'django_jinja.loaders.FileSystemLoader'を追加して、もともとの、'django.template.loaders.filesystem.Loader'と'django.template.loaders.app_directories.Loader'をコメントアウします。


現段階では、TEMPLATE_LOADERSタプルはこうなってます。

TEMPLATE_LOADERS = (
    'django_jinja.loaders.AppLoader',
    'django_jinja.loaders.FileSystemLoader',
    # 'django.template.loaders.filesystem.Loader',
    # 'django.template.loaders.app_directories.Loader',
    # 'django.template.loaders.eggs.Loader',
)


7. django-jinjaをアプリケーションとして組み込む
jin2prj/jin2prj/settings.pyのINSTALLED_APPSタプルの後ろに次の一行を追加します。

INSTALLED_APPS += ('django_jinja',)


8. Jinja2テンプレートの拡張子を指定
jin2prj/jin2prj/settings.pyに次の一行を追加することで(ここでは).jinja拡張子のものはJinja2テンプレートとして解釈させます。
※私は、TEMPLATE_LOADERSタプルの直下に追加しました。

DEFAULT_JINJA2_TEMPLATE_EXTENSION = '.jinja'


9. テンプレートファイルの保存先を指定
jin2prj/jin2prj/settings.pyのTEMPLATE_DIRSタプルにテンプレートファイルを保存するディレクトリのフルパスを追加します。今回は、jin2prj/jin2appディレクトリのフルパスを足しています。



10. Jinja2ファイルを作る
jin2prj/jin2app/index.jinjaファイル

<!DOCTYPE html>
<body>
  {% if spam == 'foo' %}
    <h1>First Condition</h1>
  {% elif spma == 'bar' %}
    <h1>Second Condition</h1>
  {% else %}
    <h1>Else Condition</h1>
  {% endif %}
</body>
</html>


11. index.jinjaを呼び出すヴューを定義
jin2prj/jin2app/views.py

from django.http import HttpResponse
from django.shortcuts import render_to_response

def index(request):
    return render_to_response('index.jinja',
            {'spam': 'foo',
                })


12. URLルーティングを追加
jin2prj/urls.pyのurlpatternsに下記一行をを追加

url(r'^$', 'jin2app.views.index'),


13. 開発サーバの起動
jin2prjディレクトリ上でmanage.pyを実行します。

python manage.py runserver


上記コマンド実行後、views.pyのspamの値('foo')を’bar'や'hoge'などに書き換えて127.0.0.1:8000にアクセスすることで、Djangoテンプレートで使えないelifが使えることが確認できます。