Django 1.8 以後已經可以選擇使用自家的 template engine 或是使用 jina2 template engine 了,而且是可以混用,不限制你只能使用其中一種。
第一步是先安裝 jinja2:
pip install jinja2
第二步是在 settings 裡的 TEMPLATES 裡增加 jinja2 的設定:
TEMPLATES = [
# 省略 django template 的設定
{
'NAME': 'jinja2',
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
# insert more TEMPLATE_DIRS here
# join(BASE_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'your_project.jinja2.environment',
},
},
]
第三步,是在 your_project 下建立 jinja2.py ,內容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import # 使用 absolute_import 很重要!!!
import logging
from django.utils import translation
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
import jinja2
logger = logging.getLogger(__name__)
def environment(**options):
env = jinja2.Environment(
extensions=['jinja2.ext.i18n', 'jinja2.ext.with_'],
**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
env.install_gettext_translations(translation) # 使用 django 的 i18n/l10n
return env
在這裡,我遇到一個奇怪的狀況,python 2 一直告訴我 jinja2 沒有 Environment,後來看了這篇,才知道是 absolute/relative import 問題,使用 absolute_import 以確保 import 的 jinja2 是正確的,而不是 django 的 jinja2。我想,python 3 應該不會有這問題。
django template 是使用 load 載入模組,jinja2 則需要在 Environment 初始化時就定義。
第四步,是在繼承 TemplateView 的類別裡,加入
template_engine = 'jinja2'
,然後在 your_app 下建立 jinja2 路徑,將 template 檔案放在那裡即可。
class Jinja2Test(TemplateView):
template_name = 'jinja2test.html' # template file 的名稱是 jinja2test.html ,檔案必須放在 your_app/jinja2 下。
template_engine = 'jinja2' # 表示要使用 jinja2 template engine,這個 jinja2 是定義在 settings 裡的 NAME
def get_context_data(self, **kwargs):
ctx = super(Jinja2Test, self).get_context_data(**kwargs)
ctx['foo'] = 'bar'
ctx['hello'] = 'world'
return ctx
參考資料: