Lila25mila
Lila25mila28 січня 2019 р. 01: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 р. 04: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 р. 04: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 р. 04:42

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

Evgenii Legotckoi
  • 15 квітня 2020 р. 04:43

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

Кирилл Порох
  • 15 квітня 2020 р. 05:04
  • (відредаговано)

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

Evgenii Legotckoi
  • 15 квітня 2020 р. 05:11
  • (відредаговано)

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42бали,
  • Рейтинг балів-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

Слідкуйте за нами в соціальних мережах