Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Использование шаблонизатора jinja2 в django 1.8.3

1

Подключаем шаблонизатор 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.



  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

24.04.2018

Обновление

05.05.2022

Категории

django

Тэги

  • django 12
  • example 16
  • jinja2 1
  • python 30

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor