Help us understand the problem. What is going on with this article?

Django1.8からテンプレートエンジンにJinja2を選べるようになっていた #djangoja

More than 3 years have passed since last update.

この記事はTokyoDjangoMeetup #3参加中に書きました。

Django1.8からテンプレートエンジンにJinja2を選べるようになりました。
設定方法は、設定ファイルのTEMPLATESを以下のように書くだけです。

settings.py
TEMPLATES = [
    {
        # ↓デフォルトの値をこれに書き換える
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # context_processorsがあると動かないので使わないようにする(後述)
            #'context_processors': [
            #    'django.template.context_processors.debug',
            #    'django.template.context_processors.request',
            #    'django.contrib.auth.context_processors.auth',
            #    'django.contrib.messages.context_processors.messages',
            #],
        },
    },
]

Jinja2はDjangoに同梱されていないので、pip install Jinja2で別途Jinja2をインストールしておいてください。

django-admin startprojectで生成されたsettings.pyでは'OPTIONS'context_processorsがありますが、これを残したままJinja2を使うと、以下のエラーが発生します。 1

Exception Type: TypeError
Exception Value: 
__init__() got an unexpected keyword argument 'context_processors'

context_processorsの代わりにenvironmentという項目を使えます。app/jinja2.pyを以下のような内容で書いて、

jinja2.py
from __future__ import absolute_import  # Python 2 only

from jinja2 import Environment
from datetime import datetime


def environment(**options):
    env = Environment(**options)
    # これがcontext_processorsの代わりになる
    env.globals.update({
        'greeting': u"HELLO!",
        'imananji': datetime.now, # ページロードのたびに結果を求めたいならcallableなオブジェクトを渡す
    })
    return env

environmentを以下のように書くと、テンプレートの中で{{ greeting }}{{ imananji() }}が使えるようになります。

settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # 'app'の部分はアプリケーションの構成によって変わります
            'environment': 'app.jinja2.environment',
        },
    },
]

  1. ... 公式ドキュメントのサンプルコードではさりげなく 'context_processors'が消されています :cry:  

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away