Lila25mila
28 січня 2019 р. 12:19

Використання Jinja2 з Django (починаючи з 1.8)

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


Якщо ж ви починаєте з Django, то він рекомендує почати з чудового уроку за даним посиланням . Також можете подивитися кілька простих інструкцій для Jinja2 від Django тут .
Отже, почнемо.

Спершу встановіть та налаштуйте Jinja2
  1. pip install Jinja2

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

  1. {
  2. BACKEND’: django.template.backends.jinja2.Jinja2’,
  3. DIRS’: [],
  4. APP_DIRS’: True,
  5. OPTIONS’: {
  6. environment’: your-app.jinja2.environment
  7. },
  8. }

Отже, всі налаштування шаблону виглядають приблизно так:

  1. TEMPLATES = [
  2. {
  3. BACKEND’: django.template.backends.jinja2.Jinja2’,
  4. DIRS’: [],
  5. APP_DIRS’: True,
  6. OPTIONS’: {
  7. environment’: your-app.jinja2.environment
  8. },
  9. },
  10. {
  11. BACKEND’: django.template.backends.django.DjangoTemplates’,
  12. DIRS’: [],
  13. APP_DIRS’: True,
  14. OPTIONS’: {
  15. context_processors’: [
  16. django.template.context_processors.debug’,
  17. django.template.context_processors.request’,
  18. django.contrib.auth.context_processors.auth’,
  19. django.contrib.messages.context_processors.messages’,
  20. ],
  21. },
  22. },
  23. ]

Не забудьте також змінити змінне середовище параметрів Jinja2 на правильне ім'я програми (змініть "your-app" на те, як називається папка вашої програми).
Середовище параметрів дозволяє використовувати певні функції в шаблонах, які налаштовуються далі. Створіть файл jinja2.py у папці вашої програми (там же, де був файл settings.py) і додайте наступне:

  1. from django.contrib.staticfiles.storage import staticfiles_storage
  2. from django.urls import reverse
  3. from jinja2 import Environment
  4. def environment(**options):
  5. env = Environment(**options)
  6. env.globals.update({
  7. static’: staticfiles_storage.url,
  8. url’: reverse,
  9. })
  10. return env

Це дозволяє нам використовувати теги шаблонів Django, такі як {% url 'index'%} або {% static 'path/to/static/file.js'%} у наших шаблонах Jinja2. Як бачите, ці теги шаблонів використовують фактичні функції Django. Наслідуючи Jinja2-способу виклику функцій у шаблоні, ви можете використовувати їх таким чином:
В Django:

  1. {% url index variable %}

що еквівалентно Jinja2:

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

І для іменованих змінних ви можете використати:

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

В Django:

  1. {% static path %}

що еквівалентно

  1. {{ static(‘path’)}}

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

Підсумкові настановні папки

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

По статті запитували0питання

3

Вам це подобається? Поділіться в соціальних мережах!

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

У МЕНЯ ОШИБКА


  1. File "C:\Users\даня\Desktop\CODS\Django\imbanamid\first\jinja2.py", line 4, in <module>
  2. from django.core.urlresolvers import reverse
  3. ModuleNotFoundError: No module named 'django.core.urlresolvers'
Evgenii Legotckoi
  • 15 квітня 2020 р. 14: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 р. 14:42

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

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

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

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

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

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

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…