Lila25mila
Lila25mila28 января 2019 г. 1:19

Использование Jinja2 с Django (начиная с 1.8)

На ресурсе Medium Corporation пользователь под ником Samu делится опытом использования Jinja2.
По его словам ранее он использовал Jinja2 в своих проектах, созданных с помощью Flask. Но затем решил использовать Jinja2 с Django для потенциального повышения производительности (в 10-20 раз быстрее по сравнению с шаблонами Django) и взаимодействия с Nunjucks.
Samu делится опытом с людьми, которые уже знакомы с данными технологиями, а его статья призвана немного раскрыть и упростить шаги.


Если же вы только начинаете с Django, то он рекомендует начать с замечательного урока по данной сылке . Так же можете посмотреть несколько простых инструкций для Jinja2 от Django здесь .
Итак, приступим.

Сначала установите и настройте Jinja2
pip install Jinja2

и не забудьте добавить его в файл needs.txt. Затем добавьте следующие настройки движка шаблонов в переменную TEMPLATES в settings.py

{
   ‘BACKEND’: ‘django.template.backends.jinja2.Jinja2’,
   ‘DIRS’: [],
   ‘APP_DIRS’: True,
   ‘OPTIONS’: {
     ‘environment’: ‘your-app.jinja2.environment’
   },
 }

Итак, все настройки шаблона выглядят примерно так:

TEMPLATES = [
 {
   ‘BACKEND’: ‘django.template.backends.jinja2.Jinja2’,
   ‘DIRS’: [],
   ‘APP_DIRS’: True,
   ‘OPTIONS’: {
     ‘environment’: ‘your-app.jinja2.environment’
   },
 },
 {
   ‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
   ‘DIRS’: [],
   ‘APP_DIRS’: True,
   ‘OPTIONS’: {
     ‘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 на правильное имя приложения (измените «your-app» на то, как называется папка вашего приложения).
Среда параметров позволяет нам использовать определенные функции в шаблонах, которые настраиваются дальше. Создайте файл jinja2.py в папке вашего приложения (там же, где был файл settings.py) и добавьте следующее:

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
def environment(**options):
    env = Environment(**options)
    env.globals.update({
        ‘static’: staticfiles_storage.url,
        ‘url’: reverse,
    })
 return env

Это позволяет нам использовать теги шаблонов Django, такие как {% url ‘index’%} или {% static ‘path / to / static / file.js’%} в наших шаблонах Jinja2. Как видите, эти теги шаблонов используют фактические функции, предоставляемые Django. Следуя Jinja2-способу вызова функций в шаблоне, вы можете использовать их следующим образом:
В Django:

{% url ‘index’ variable %}

что эквивалентно в Jinja2:

{{url(‘index’, args=[variable])}}

И для именованных переменных вы можете использовать:

{{url('index', kwargs={'variable_key':variable}}}

В Django:

{% static ‘path’ %}

что эквивалентно

{{ static(‘path’)}}

Как вы, наверное, уже заметили, вы можете в основном добавлять любые функции в среду Jinja2, добавляя их в файл jinja2.py, для дальнейшего использования в шаблонах.

Итоговые установочные папки

После того, как вы правильно выполните настройки, в дальнейшем можно просто создать папку Jinja2 в любом месте, где будет создана папка шаблонов. Работать должно автоматически, так как Django - это довольно хорошая среда. Наличие обоих шаблонов Django и Jinja2 позволяет вам гибко использовать оба. Например, у вас может быть панель администратора Django, и различные плагины для работы, которые используют шаблоны Django. Обязательно прочитайте документацию Jinja2, чтобы узнать больше.
Ниже представлен пример того, как одна структура папок приложения может выглядеть для проекта:

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Кирилл Порох
  • 15 апреля 2020 г. 4:19
  • (ред.)

У МЕНЯ ОШИБКА


File "C:\Users\даня\Desktop\CODS\Django\imbanamid\first\jinja2.py", line 4, in <module>
    from django.core.urlresolvers import reverse
ModuleNotFoundError: No module named 'django.core.urlresolvers'
Evgenii Legotckoi
  • 15 апреля 2020 г. 4:31

Выглядит так, что текущая версия jinja2 несовместима с с той версией Django, которую вы используете. По ходу разработчики Jinja2 так до сих пор не обновились.

Эта строчка from django.core.urlresolvers import reverse соответствует старым версия джанго, до версии 2 точно, как обстоит дело с более поздними версиями точно не помню, но на данный момент в последних вторых и третьих версиях джанго используется такой импорт from django.urls import reverse .

В вашем случае есть следующие выходы:

  • Откатить джанго на более раннюю версию
  • Использовать стандартный шаблонизатор или какой-то другой... хотя тут альтернативы практически нет.
  • Убедиться, что вы точно используете последнюю версию jinja и она имеет нормальную совместимость с Django, всё-таки как никак этот шаблонизатор хорошо поддерживается разрабами и полагаю, что у вас просто установилась не самая актуальная версия.
  • Написать bug-request разработчикам jinja
  • Написать исправление и сделать pull-request разработчикам jinja
Кирилл Порох
  • 15 апреля 2020 г. 4:42

Спасибо, всё заработало!

Evgenii Legotckoi
  • 15 апреля 2020 г. 4:43

Пожалуйста, а что конкретно сделали? Откатились?

Кирилл Порох
  • 15 апреля 2020 г. 5:04
  • (ред.)

Да,откатился . Неподскажите где найти документацию jinja2 на русском?

Evgenii Legotckoi
  • 15 апреля 2020 г. 5:11
  • (ред.)

К сожалению нет, не подскажу. У меня был интерес к этому шаблонизатору, но так получилось, что мне пришлось бы переписывать очень большую часть проекта, чтобы его внедрить, поэтому я отказался до лучших времён, поскольку трудозатраты не окупились бы на данный момент.
Следовательно я дальше изучения основ не пошёл, поэтому и на русскоязычную документацию не имел возможности натолкнуться.
Но скорее всего полной русскоязычной документации вовсе нет, максимум отдельные статьи на разных ресурсах.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ОН

C++ - Тест 006. Перечисления

  • Результат:10баллов,
  • Очки рейтинга-10
K
  • KiRi4
  • 7 сентября 2023 г. 16:57

C++ - Тест 002. Константы

  • Результат:41баллов,
  • Очки рейтинга-8
K
  • KiRi4
  • 7 сентября 2023 г. 16:49

C++ - Тест 001. Первая программа и типы данных

  • Результат:66баллов,
  • Очки рейтинга-1
Последние комментарии
IscanderChe
IscanderChe13 сентября 2023 г. 18:11
Пример использования QScintilla C++ По горячим следам (с другого форума вопрос задали, пришлось в памяти освежить всё) решил дополнить. Качаем исходники с https://riverbankcomputing.com/software/qscintilla/downlo…
Evgenii Legotckoi
Evgenii Legotckoi6 сентября 2023 г. 16:18
Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread Разве могут взаимодействовать объекты из разных нитей как-то, кроме как через сигнал-слоты?" Могут. Выполняя оператор new , Вы выделяете под объект память в куче (heap), …
AC
Andrei Cherniaev5 сентября 2023 г. 12:37
Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread Я поясню свой вопрос. Выше я писал "Почему же в методе MainWindow::on_write_1_clicked() Можно обращаться к методам exampleObject_1? Разве могут взаимодействовать объекты из разных…
n
nvn31 августа 2023 г. 18:47
QML - Урок 004. Сигналы и слоты в Qt QML Здравствуйте! Прекрасный сайт, отличные статьи. Не хватает только готовых проектов для скачивания. Многих комментариев типа appCore != AppCore просто бы не было )))
NSProject
NSProject24 августа 2023 г. 22:40
Django - Урок 023. Like Dislike система с помощью GenericForeignKey Ваша ошибка связана с gettext from django.utils.translation import gettext_lazy as _ Поле должно выглядеть так vote = models.SmallIntegerField(verbose_name=_("Голос"), choices=VOTES) …
Сейчас обсуждают на форуме
IscanderChe
IscanderChe17 сентября 2023 г. 18:24
Интернационализация строк в QMessageBox Странная картина... Сделал минимально работающий пример - всё работает. Попробую на другой операционке. Может, дело в этом.
NSProject
NSProject17 сентября 2023 г. 17:49
Помогите добавить Ajax в проект В принципе ничего сложного с отправкой на сервер нет. Всё что ты хочешь отобразить на странице передаётся в шаблон и рендерится. Ты просто создаёшь файл forms.py в нём описываешь свою форму и в …
BlinCT
BlinCT15 сентября 2023 г. 21:35
Размеры полей в TreeView Всем привет. Пытаюсь сделать дерево вот такого вида Пытаюсь организовать делегат для каждой строки в дереве. ТО есть отступ какого то размера и если при открытии есть под…
IscanderChe
IscanderChe8 сентября 2023 г. 21:07
Кастомная QAbstractListModel и цвет фона, цвет текста и шрифт Похоже надо не абстрактный , а "реальный" типа QSqlTableModel Да, но не совсем. Решилось с помощью стайлшитов и setFont. Спасибо за отлик!
Evgenii Legotckoi
Evgenii Legotckoi6 сентября 2023 г. 15:35
Вопрос: Нужно ли в деструкторе удалять динамически созданные QT-объекты. Напр: Зависит от того, как эти объекты были созданы. Если вы передаёте указатель на parent объект, то не нужно, Ядро Qt само разрулит удаление, если нет, то нужно удалять вручную, иначе будет ут…

Следите за нами в социальных сетях