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
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов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 аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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