Перейти к содержимому

Шаблоны документов

В учётной записи абонента есть вкладка “Шаблоны документов”. Там можно управлять списком шалонов для всех абонентов. Кроме классических операций CRUD можно посмотреть историю изменений шалона, и получить сформированных для абонента документ, кликнув по ссылке с именем файла шаблона.

Чтоб подставить в документ значения из учётной записи абонента, используйте двойные фигурные скобки с пробелом. Например, переменная var:

{{ var }}

Пример текста шаблона документа:

Заголовок.
Имя: {{ fio }}
платёжный код: {{ username }}
Тедефон: {{ p_tel }}
И осатальное: {{ description }}
Серийный номер оконечного оборудования абонента: {{ device.serial }}
Мак адрес оконечного оборудования абонента: {{ device.mac }}

Оформите так документ в формате docx, загрузите в реестр шалонов в системе. И можете скачивать отформатированные версии ля каждого абонента. Сформированный документ из примера выше будет выглядеть, например, так:

Заголовок.
Имя: Иавнов Иван Иванович
платёжный код: 123456
Тедефон: +79781234567
И осатальное: Длинное описание в учётной записи абонента
Серийный номер оконечного оборудования абонента: ZTEGC094B3A5
Мак адрес оконечного оборудования абонента: 00:d4:9e:68:a5:01

Пример всех данных, доступных для использования:

context {
"balance": "0.00",
"birth_day": "2000-01-01",
"contract": {
"contract_number": "141230",
"customer": 5774,
"end_service_time": null,
"extended_data": null,
"id": 1567,
"is_active": true,
"note": null,
"start_service_time": "2020-02-14 21:00:00",
"title": "Договор на оказание услуг связи"
},
"create_date": "2025-05-05",
"description": "тестовая анкета",
"device": {
"address": "стр Россия, Респ, р-н Тестовый, г. Город ул Улица д 1",
"create_time": "2016-12-31 21:00:00",
"dev_port": null,
"dev_type": "Zte ONU F660 V2",
"ip_address": null,
"mac": "45:47:c0:46:3e:da",
"serial": "ZTEGC0463EDA",
"title": "Больничная 3"
},
"fio": "Мистер Тестовый Человек",
"p_address": "стр Россия, Респ, р-н Тестовый, г. Город ул Улица д 1",
"p_tel": "+79781234567",
"passport": {
"customer": 12345,
"date_of_acceptance": "2025-07-03",
"distributor": "ФФМС",
"division_code": "123-123",
"id": 10487,
"number": "123123",
"passport_type": "ru",
"registration_address": 13582,
"registration_address_title": "стр Россия, Респ, р-н Тестовый, г. Город ул Улица д 1",
"series": "1234"
},
"now": "2025-07-17 13:45:37.898754",
"username": "444418"
}

можно использовать через точку, например, номер паспорта будет выглядеть так:

{{ passport.number }}

Когда какая-то переменная может быть пустой, может быть удобно отображать разные блоки информации в зависимости от наличия значений в этих переменных. Тогда можно использовать условия в формате Jinja2.

Например, указывать информацию о паспорте абонента только если он заключил договор, иначе писать что не заключил:

{% if contract and contract.is_active and passport %}
Номер паспорта: {{ passport.number }}
{% else %}
Абонент ещё не заключил договор
{% endif %}

Или, если договор уже завершён:

{% if not contract.is_active %}
Завершённый договор
{% endif %}

Переменная now отображает текущее время. Её можно форматировать с помощью метода strftime из python. Например так: {{ now.strftime('%Y-%m-%d') }}, что преобразуется в дату в виде: 2025-01-01.

Коды:

ДирективаОписаниеПример
%aДень недели - сокращенное название региона.Sun, Mon, …, Sat (en_US); So, Mo, …, Sa (de_DE)
%AДень недели в качестве полного названия региона.Sunday, Monday, …, Saturday (en_US); Sonntag, Montag, …, Samstag (de_DE)
%wДень недели - десятичное число, где 0 - воскресенье, а 6 - суббота.0, 1, …, 6
%dДень месяца в виде десятичного числа, дополненного нулем.01, 02, …, 31
%bМесяц - сокращенное название региона.Jan, Feb, …, Dec (en_US); Jan, Feb, …, Dez (de_DE)
%BМесяц в качестве полного названия региона.January, February, …, December (en_US); Januar, Februar, …, Dezember (de_DE)
%mМесяц в виде десятичного числа, дополненного нулем.01, 02, …, 12
%yГод без столетия в виде десятичного числа, дополненного нулем.00, 01, …, 99
%YГод с веком в качестве десятичного числа.0001, 0002, …, 2013, 2014, …, 9998, 9999
%HЧас (24-часовые часы) в виде десятичного числа, дополненного нулем.00, 01, …, 23
%IЧас (12-часовые часы) в виде десятичного числа, дополненного нулем.01, 02, …, 12
%pЯзыковой эквивалент AM или PM.AM, PM (en_US); am, pm (de_DE)
%MМинута - десятичное число, дополненное нулем.00, 01, …, 59
%SСекунда - это десятичное число, дополненное нулем.00, 01, …, 59
%fМикросекунда в виде десятичного числа, дополненного нулем слева.000000, 000001, …, 999999
%zСмещение по UTC в виде +HHMM или -HHMM (пустая строка, если объект является наивным).(empty), +0000, -0400, +1030
%ZНазвание часового пояса (пустая строка, если объект является наивным).(empty), UTC, EST, CST
%jДень года в виде десятичного числа, дополненного нулем.001, 002, …, 366
%UНомер недели в году (воскресенье - первый день недели) в виде десятичного числа с дополнением к нулю. Все дни в новом году, предшествующие первому воскресенью, считаются относящимися к неделе 0.00, 01, …, 53
%WНомер недели в году (понедельник - первый день недели) в виде десятичного числа. Все дни в новом году, предшествующие первому понедельнику, считаются неделей 0.00, 01, …, 53
%cСоответствующее языковому стандарту представление даты и времени.Tue Aug 16 21:30:00 1988 (en_US); Di 16 Aug 21:30:00 1988 (de_DE)
%xСоответствующее языковому стандарту представление даты.08/16/88 (None); 08/16/1988 (en_US); 16.08.1988 (de_DE)
%XСоответствующее времени представление в локали.21:30:00 (en_US); 21:30:00 (de_DE)
%%Буквально символ ’%’%

Перевод документации функции strftime

Более полная дока по шаблонизации тут: docxtpl.readthedocs.io/en/latest/.

И по Jinja тут: https://jinja.palletsprojects.com/en/stable/.