Lila25mila
Jan. 28, 2019, 12:19 p.m.

Using Jinja2 with Django (since 1.8)

On the Medium Corporation resource, a user named Samu shares his experience using Jinja2.
According to him, he previously used Jinja2 in his projects built with Flask. But then I decided to use Jinja2 with Django for potential performance gains (10-20x faster compared to Django templates) and interaction with Nunjucks.
Samu shares his experience with people who are already familiar with these technologies, and his article is intended to reveal and simplify the steps a little.


If you're just getting started with Django, he recommends starting with a great tutorial at this link . You can also see some simple instructions for Jinja2 from Django here .
So let's get started.

Install and configure Jinja2 first
  1. pip install Jinja2

and don't forget to add it to the needs.txt file. Then add the following templating engine settings to the TEMPLATES variable in 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. }

So, all template settings look something like this:

  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. ]

Don't forget to also change the Jinja2 settings environment variable to the correct app name (change "your-app" to whatever your app folder is called).
The options environment allows us to use certain features in templates that are further customized. Create a jinja2.py file in your application folder (in the same place as the settings.py file) and add the following:

  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

This allows us to use Django template tags like {% url 'index' %} or {% static 'path / to / static / file.js' %} in our Jinja2 templates. As you can see, these template tags use the actual functionality provided by Django. Following the Jinja2 way of calling functions in a template, you can use them like this:
В Django:

  1. {% url index variable %}

which is equivalent in Jinja2:

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

And for named variables you can use:

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

В Django:

  1. {% static path %}

which is equivalent to

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

As you've probably already noticed, you can basically add any functionality to the Jinja2 environment by adding it to the jinja2.py file for later use in templates.

Final installation folders

Once you've got your settings right, you can then simply create a Jinja2 folder anywhere you'd like a templates folder to be created. It should work automatically since Django is a pretty good framework. Having both Django and Jinja2 templates allows you the flexibility to use both. For example, you might have a Django admin panel, and various plugins to work with that use Django templates. Be sure to read the Jinja2 documentation to learn more.
Below is an example of what one application folder structure might look like for a project:

By article asked0question(s)

3

Do you like it? Share on social networks!

Кирилл Порох
  • April 15, 2020, 2:19 p.m.
  • (edited)

У МЕНЯ ОШИБКА


  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
  • April 15, 2020, 2:31 p.m.

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

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

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

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

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

Evgenii Legotckoi
  • April 15, 2020, 2:43 p.m.

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

Кирилл Порох
  • April 15, 2020, 3:04 p.m.
  • (edited)

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

Evgenii Legotckoi
  • April 15, 2020, 3:11 p.m.
  • (edited)

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • AK
    April 1, 2025, 11:41 a.m.
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup