Подключаем шаблонизатор jinja2 к django 1.8.3 приложению
В качестве превью, скажу лишь, что решил написать статью, так как новичкам сложно разобраться
с разрозненной информацией в интернет. В окружение ставим jinja2 в django уже из коробки есть поддержка этого шаблонизатора. Можно установить django-jinja это сторонний бэкенд, он не нужен. Прописывать в apps и ещё куда-то ничего не следует. Просто pip install jinja2
и всё. У меня используется django 1.8.3 и python 2.7.
Правильные настройки
В django темплейтах нужно прописать настройки.
# -*- coding: utf-8 -*-
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
os.path.join(BASE_DIR, 'templates/jinja2'),
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'project.jinja2.CustomEnvironment',
},
},
]
Окружение jinja
В папке project
создаем файл jinja2.py
c классом CustomEnvironment
. Для того, чтобы добавить в контекст static
, url
или что-то ещё. В интернете очень сильно разняться данные. Но на самом дле поведение такое: при инициализации в Jinja2
в **options
передается environment
из settings.py
, ожидается что это будет какой-то ваш класс или будет использован jinja2.Environment
. Для себя вижу единственно правильный способ сделать то что делается с помощью функций в других мануалах.
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse
from jinja2 import Environment
class CustomEnvironment(Environment):
def __init__(self, **options):
super(CustomEnvironment, self).__init__(**options)
self.globals.update({
'static': staticfiles_storage.url,
'url': reverse
})
Правильные views.py
Правильное рабочее представление использует функцию render, а не render_to_response. В generic у django есть замечательный Template View, который обязателен к использованию.
# -*- coding: utf-8 -*-
from django.views.generic.base import TemplateView
class MainPage(TemplateView):
template_name = 'main.html'
Использование render backend независимое и избавит вас от возможных ошибок.
Возможные ошибки
Код Views.py
class MainPage(View):
def get(self, request):
template_name = 'main.html'
return render_to_response(template_name, context_instance=RequestContext(request))
Ошибка
TemplateDoesNotExist at /
main.html
Этот код работать не будет !!!
Нельзя использовать render_to_response. Эта функция использует loader.render_to_string
, в которой проверяется что engine является экземпляром django.template.backends.django.DjangoTemplates
.
Решение проблемы - используйте функцию django.shortcuts.render
. К тому же в новых версиях django это единственный django way.
Полезные ссылки
https://niwinz.github.io/django-jinja/latest/
http://qaru.site/questions/294582/how-to-use-jinja2-as-a-templating-engine-in-django-18
P.S. В django + jinja2 есть коровья сила. Статья посвещается руководителю сектора 523.