Было: {field} (одинарные фигурные скобки)
Стало: {{field}} (двойные фигурные скобки)
| Поле | Описание | Источник данных |
|---|---|---|
{{first}} |
Имя | user.name.first |
{{middle}} |
Отчество | user.name.middle |
{{name}} |
Полное имя | user.name.first + user.name.middle + user.name.last |
{{position}} |
Должность | user.position |
{{mail}} |
Email адрес | user.nickname@domain или user.emails[0] |
{{telephone}} |
Рабочий телефон | user.phone |
{{mobile}} |
Мобильный телефон | user.mobile или из user.phones |
{{department}} |
Отдел | user.department |
Функция теперь полностью удаляет HTML элементы, содержащие пустые переменные:
<div>...</div>с пустыми переменными<p>...</p>с пустыми переменными<span>...</span>с пустыми переменными<blockquote>...</blockquote>с пустыми переменными- Строки, содержащие только пустые переменные
- Пустые HTML теги после подстановки
Шаблон:
<div>Имя: {{name}}</div>
<div>Отчество: {{middle}}</div>
<div>Фамилия: {{last}}</div>
<div>Телефон: {{telephone}}</div>
<div>Мобильный: {{mobile}}</div>
<div>Должность: {{position}}</div>
<div>Отдел: {{department}}</div>Если у пользователя нет отчества, телефонов, должности и отдела:
<div>Имя: Иван Петров</div>Функция выполняет многоуровневую очистку:
- Подстановка переменных - замена
{{field}}на значения - Удаление пустых переменных - удаление элементов с
{{field}} - Очистка пустых HTML тегов - удаление
<div></div>,<blockquote></blockquote> - Удаление пустых строк - очистка лишних переносов строк
- Финальная очистка - удаление завершающих пустых строк
user = {
'name': {'first': 'Иван', 'middle': 'Петрович', 'last': 'Петров'},
'position': 'Менеджер',
'department': 'IT отдел',
'phone': '+7-123-456-7890',
'mobile': '+7-987-654-3210'
}Результат: Все поля отображаются
user = {
'name': {'first': 'Анна', 'middle': '', 'last': 'Сидорова'},
'position': 'Директор',
'department': '',
'phone': '+7-111-222-3333',
'mobile': ''
}Результат: Пустые поля (отчество, отдел, мобильный) удаляются
user = {
'name': {'first': 'Петр', 'middle': '', 'last': 'Иванов'},
'position': '',
'department': '',
'phone': '',
'mobile': ''
}Результат: Только имя и email отображаются
<div><strong>{{name}}</strong></div>
<div>Email: {{mail}}</div>
<div>Телефон: {{telephone}}</div>
<div>Мобильный: {{mobile}}</div>
<div>Должность: {{position}}</div>
<div>Отдел: {{department}}</div><div style="font-family: Arial;">
<div><strong>{{name}}</strong></div>
<div>Email: <a href="mailto:{{mail}}">{{mail}}</a></div>
<div>Телефон: {{telephone}}</div>
<div>Мобильный: {{mobile}}</div>
<div>Должность: {{position}}</div>
<div>Отдел: {{department}}</div>
</div>patterns_to_remove = [
r'<div[^>]*>\s*{{[^}]+}}\s*</div>',
r'<p[^>]*>\s*{{[^}]+}}\s*</p>',
r'<span[^>]*>\s*{{[^}]+}}\s*</span>',
r'<blockquote[^>]*>\s*{{[^}]+}}\s*</blockquote>',
r'^\s*{{[^}]+}}\s*$',
]
# Дополнительная очистка
substituted = re.sub(r'<blockquote[^>]*>\s*<div[^>]*>\s*[^<]*:\s*</div>\s*</blockquote>', '', substituted)
substituted = re.sub(r'<div[^>]*>\s*[^<]*:\s*</div>', '', substituted)
substituted = re.sub(r'<div[^>]*>\s*</div>', '', substituted){{telephone}}- рабочий телефон изuser.phone{{mobile}}- мобильный телефон изuser.mobileили поиск вuser.phonesс типом 'mobile'
- Приоритет:
user.emails[0]если есть, иначеuser.nickname@domain
- Чистый результат - автоматическое удаление пустых полей
- Гибкость - поддержка различных типов контактной информации
- Читаемость - четкое разделение между полями
- Производительность - эффективная обработка с регулярными выражениями
- Надежность - многоуровневая очистка гарантирует чистый результат
Функция substitute_template_variables успешно обновлена и протестирована. Все требования выполнены:
- ✅ Поддержка двойных фигурных скобок
{{field}} - ✅ Поддержка всех указанных полей
- ✅ Автоматическое удаление пустых полей
- ✅ Многоуровневая очистка результата
- ✅ Обратная совместимость с существующим API
- ✅ Протестировано на различных сценариях
Функция готова к использованию в продакшене! 🚀