第一步是先安裝 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參考資料:
沒有留言:
張貼留言