Skip to content

{% raw %}

jinja2

Что это?

jinja2 - шаблонизатор - штука, которая рендерит строки с шаблонами

!!! note

При работе с jinja шаблонами в контекст стоит передавать данные как можно подробнее, не просто context=context, а лучше
сделать словарь со всеми полями, которые будешь юзать - так поиск по использованиям будет норм робить, а то поиск по
html не оч робит

Пример

<!-- template.html-->

Order #{{order_number}}
import jinja2

env = jinja2.Environment()

rendered = env.get_template('template.html').render(order_number=2)

assert rendered == "Order #2"

Как обрезать ентеры?

env = jinja2.Environment(trim_blocks=True)

О чем речь?

Допустим, есть такой шаблон:

{% if True %}
sam
{% endif %}
text

При обычном рендере получим такое:


sam

text

(и еще перед sam ентер, хз поч маркдаун его обрезает)

Нам эти пробелы бывают не нужны, хочется так:

sam
text

Чтобы было без пробелов, передаем в jinja2.Environment параметр trim_blocks=True

Фильтры

Что такое?

Фильтр - функции, которые можно применять внутри тега


assert jinja2.Template('{{ "sam" | upper }}').render() == 'SAM'

Как писать свои?

  • Фильтр - это просто функция:
def wrap_with_b(str_):
    return f'<b>{str_}</b>'
  • Ее нужно зарегистрировать в jinja2.Environment:
env = jinja2.Environment()
env.filters.update({
    'b': wrap_with_b,
})
  • Теперь можно использовать в шаблонах:
<!-- template.html-->

{{ "order" | b}}
import jinja2


def wrap_with_b(str_):
    return f'<b>{str_}</b>'


env = jinja2.Environment()
env.filters.update({
    'b': wrap_with_b,
})

rendered = env.get_template('template.html').render()

assert rendered == "<b>order</b>"

Как передавать дополнительные аргументы?

  • Первый аргумент функции - значение шаблона, а остальные аргументы передаем как обычно - в скобках
<!-- template.html-->

{{ "order" | icon("❤") }}

def icon(str_, icon_):
    return f"{icon_} {str_}"


env = jinja2.Environment()
env.filters.update({
    u"icon": icon,
})

rendered = env.get_template('template.html').render()

assert rendered == "❤ order"

{% endraw %}