Наш шаблонизатор использует минимальный синтаксис для выполнения Вашей работы.
Шаблонизатор построен на движке Jinja2, который имеет огромные возможности кастомизации.
Давайте начнем с основ и перейдем к более сложным сценариям.
{
"name": "Петр Иванович"
}
Здравствуйте {{ name }}
Здравствуйте Петр Иванович
Двойные фигурные скобки {{ }} позволяют получить результат выражения или переменной и вывести значение в шаблоне.
{{ 10 + 5 }}
{{ 10 / 3 }}
{{ 10 // 3}}
{{ 10 % 3 }}
{{ 10 ** 3 }}
15
3.3333333333333335
3
1
1000
{
"fruit": "Яблоко",
"price": 50"
}
{{ fruit }} стоит {{ price }} рублей.
Яблоко стоит 50 рублей.
Внутри Вашего шаблона, можно определить переменные, для хранения часто используемых значений.
Или необходимо сохранить что-либо для использования позднее. Вместо написания значения каждый раз, используем переменную. Переменные, определенные вне управляющих конструкций, ведут себя как глобальные переменные, и доступны из любого места. Переменные, созданные внутри конструкций, ведут себя как локальные переменные, и видимы только внутри этих конкретных конструкций.
{% set name = 'Иван Петрович' %}
Здравствуйте {{ name }}
Здравствуйте Петр Иванович
Можно объявить сразу несколько переменных, в одной строке.
{% set name, surname = 'Иван', 'Петрович' %}
Здравствуйте {{ name }} {{ surname }}
Здравствуйте Петр Иванович
Управляющие конструкции позволяют добавлять в шаблоны элементы управления потоком и циклы.
По умолчанию, управляющие конструкции используют разделитель {% %} вместо двойных фигурных скобок {{ }}.
Для понимания работы, давайте сразу рассмотрим несколько примеров.
JSON-представление объекта:
{
"name": "Петр Иванович",
"age": 45
}
{% if name == 'Петр Иванович' and age == 15 %}
Совсем Вы молодой {{ name }}, Вам всего {{ age }} лет.
{% elif name == 'Петр Иванович' and age == 25 %}
Ну уже постарше. {{ name }}, Вам всего {{ age }} лет.
{% elif name == 'Петр Иванович' and age == 45 %}
Отлично! Мы узнали, что Вам {{ name }}, уже {{ age }} лет.
{% else %}
Я Вас не знаю, и знать не хочу.
{% endif %}
Отлично! Мы узнали, что Вам Петр Иванович, уже 45 лет.
В первой строке проверяется, если переменная "name" равна строке "Петр Иванович",
и переменная "age" равно числу 45, то выполнится блок:
Если первое условие не выполняется, то благодаря оператору "elif", проверяем следующее условие, аналогично первому.
В случае, если не выполняется, ни одно из условий, то будет выполнен блок в операторе "else".
Управляющие инструкции также могут быть вложенными.
{% if name == 'Петр Иванович' %}
{% if age == 15 %}
Совсем Вы молодой {{ name }}, Вам всего {{ age }} лет.
{% else %}
Да, да! Вам {{ name }}, уже не 15 лет!
{% endif %}
{% endif %}
Да, да! Вам Петр Иванович, уже не 15 лет!
Если условия становятся слишком сложными, можно обернуть выражения скобками ():
{% if (age > 15) and (age =< 45) %}
Здравствуйте, Петр Иванович. Мы вас узнали.
{% endif %}
{% if (name == 'Дмитрий Николаевич') or (name == 'Иван Иванович') %}
Привет, Дмитрий или Иван!
{% endif %}
Здравствуйте, Петр Иванович. Мы вас узнали.
Цикл for позволяет перебирать последовательность.
JSON-представление объекта:
{
"name": "Петр Иванович",
"fruits": {
"loves": ["Яблоки", "Апельсины"],
"not_loves": ["Груши", "Ананасы", "Киви"]
}
}
Цикл можно проходить не только по массиву, но и по словарю.
JSON-представление объекта:
{
"name": "Петр Иванович",
"age": 45,
"about": "Хороший человек"
}
Вы не поверите, но той информации, что Вы уже узнали, хватит, что-бы создать динамически наполняемую таблицу.
Рассмотрим пример.
{
"col_labels": ["Фрукты", "Овощи", "Камни", "Мебель"],
"tbl_contents": [
{"cols": ["банан", "перец", "пирит", "стул"]},
{"cols": ["яблоко", "помидор", "алмаз", "стол"]},
{"cols": ["апельсин", "картошка", "янтарь", "кровать"]}
]
}
Конструкция {% colspan <переменная> %} должна быть обязательно.
Для динамического распределения по множеству столбцов.
В документе она не учитывается, и нужна только в шаблоне.
В таблице упомянуты остальные широко используемые атрибуты переменной loop.
№ | Метод | Значение |
---|---|---|
1 | loop.index0 | Тоже самое что и loop.index, но с индексом 0, то есть, начинает считать с 0, а не с 1. |
2 | loop.revindex | Возвращает номер итерации с конца цикла (считает с 1). |
3 | loop.revindex0 | Возвращает номер итерации с конца цикла (считает с 0). |
4 | loop.first | Возвращает True, если итерация первая. В противном случае — False. |
5 | loop.first | Возвращает True, если итерация последняя. В противном случае — False. |
6 | loop.first | Возвращает длину цикла(количество итераций). |
Давайте рассмотрим еще один пример. Сделаем форму заказа товаров.
JSON-представление объекта:
{
"customer_name": "Иван",
"items": [
{"desc": "Апельсины", "qty": 2, "price": "Бесплатно"},
{"desc": "Мандарины", "qty": 5403, "price": "500,000"},
{"desc": "Киви", "qty": 1, "price": "100,000,000.00"}
],
"in_europe": true,
"is_paid": false,
"company_name": "PRINTDOC",
"total_price": "100,000,000.00"
}
{% set name = 'иван петрович' %}
Здравствуйте {{ name|title }}
Здравствуйте Иван Петрович
Можно использовать несколько фильтров, чтобы точнее настраивать вывод. Например:
{{ full_name|striptags|title }}Фильтр striptags удалит из переменной все HTML-теги.
В приведенном выше коде сначала будет применен фильтр striptags, а затем — title.
Фильтр round округляет число до конкретного количества символов.
В следующей таблице указаны широко используемые фильтры.
№ | Название | Описание |
---|---|---|
1 | upper | Приводит все строковые символы в верхнему регистру. |
2 | lower | Приводит все строковые символы в нижнему регистру. |
3 | capitalize | Делает заглавной первую букву и приводит остальные к нижнему регистру. |
4 | length | Возвращает количество элементов в массиве. |
5 | trim | Удаляет пустые символы в начале и в конце строки. |
6 | random | Возвращает случайный элемент последовательности. |
Для управления абзацами, строками таблицы, столбцами таблицы, оформлением строк должен использоваться специальный синтаксис.
ВАЖНО: Не используйте {%p, {%tr, {%tc или {%r два раза в том же параграфе, строке или столбце. Пример:
Неправильно:{%p if display_paragraph %} Это мой параграф {%p endif %}
Правильно:{%p if display_paragraph %}
Это мой параграф
{%p endif %}
ВАЖНО: Используйте неразрывный пробел ( CTRL + SHIFT + ПРОБЕЛ ), когда требуется пробел в начале или в конце строки.
ВАЖНО: Теги должны располагаться отдельно в строке: не добавляйте текст до или после в той же строке.
ВАЖНО: Всегда ставьте пробел после начального разделителя переменных / тегов
Неправильно:{{myvariable}}
{%if something%}
{{ myvariable }}
{% if something %}
Есть особый случай, когда вы хотите изменить цвет фона ячейки таблицы, вы должны поместить следующий тег в самое начало ячейки:
{% cellbg <переменная> %}
Если вы хотите динамически распределить ячейку таблицы по множеству столбцов (это полезно, когда у вас есть таблица с динамическим подсчетом столбцов),
вы должны поместить следующий тег в самое начало ячейки.
{% colspan <переменная> %}
Для того, чтобы отобразить {%, %}, {{ или }} , можно использовать:
{_%, %_}, {_{ или }_}
Вы можете растянуть ячейки таблицы по горизонтали двумя способами, используя colspan (см. шаблон: dynamic_table_tpl.docx):
{% colspan <количество колонок> %}
или внутри цикла for (см. шаблон: horizontal_merge_tpl):
{% hm %}
Вы также можете объединять ячейки по вертикали в цикле for (см. шаблон: vertical_merge_tpl.docx):
{% vm %}
Более подробное описание функционала шаблонизатора, Вы можете найти на официальном сайте Jinja2.
Лучший способ увидеть, как это работает - скачать, и посмотреть примеры.
*.docx файлы - код шаблона и готовый результат (как в документе).
*.json файлы - json код, для передачи в шаблон.
№ | Шаблон | JSON |
---|---|---|
1 | vertical_merge_tpl.docx | Встроен в файл шаблона. |
2 | vertical_merge_nested_tpl.docx | Встроен в файл шаблона. |
3 | nested_for_tpl.docx | nested_for_tpl.json |
4 | less_cells_after_loop_tpl.docx | Встроен в файл шаблона. |
5 | horizontal_merge_tpl.docx | Встроен в файл шаблона. |
6 | cellbg_tpl.docx | cellbg_tpl.json |
7 | order_tpl.docx | order_tpl.json |
8 | dynamic_table_tpl.docx | dynamic_table_tpl.json |
9 | header_footer_entities_tpl.docx | header_footer_entities_tpl.json |