Функция format_html_join
Функция format_html_join применяется для построения
HTML-строки путем многократного применения формата
к последовательности данных. Она принимает разделитель,
строку формата и итерируемый объект с аргументами для
форматирования. В отличие от ручной конкатенации строк,
функция автоматически экранирует все передаваемые
значения, предотвращая XSS-уязвимости, но при этом
позволяет вставлять безопасные HTML-теги.
Параметры функции:
-
separator- строка, которая будет вставляться между сгенерированными фрагментами (например, запятая, перенос строки или пустая строка) -
format_string- строка формата с плейсхолдерами%s, определяющая шаблон каждого фрагмента -
args_generator- итерируемый объект, возвращающий кортежи аргументов для подстановки в строку формата
Функция возвращает объект SafeString, который
безопасен для вывода в HTML-шаблонах без дополнительного
экранирования.
Синтаксис
from django.utils.html import format_html_join
format_html_join(separator, format_string, args_generator)
Пример
Давайте сгенерируем список ссылок для навигационного меню:
from django.utils.html import format_html_join
links = [
("Главная", "/"),
("Блог", "/blog/"),
("Контакты", "/contacts/"),
]
nav_html = format_html_join(
'\n',
'<a href="{}">{}</a>',
((url, name) for name, url in links),
)
print(nav_html)
Результат выполнения кода:
"<a href="/">Главная</a>\n<a href="/blog/">Блог</a>\n<a href="/contacts/">Контакты</a>"
Пример
Давайте создадим список тегов для статьи с использованием списка значений из модели:
from django.utils.html import format_html_join
from myapp.models import Tag
tags = Tag.objects.filter(is_active=True).values_list('name', 'slug')
tags_html = format_html_join(
', ',
'<span class="tag">{}</span>',
((name,) for name, slug in tags),
)
print(tags_html)
Результат выполнения кода:
"<span class="tag">Python</span>, <span class="tag">Django</span>, <span class="tag">Web</span>"
Пример
Давайте сгенерируем таблицу с данными пользователей, используя безопасную вставку HTML-тегов:
from django.utils.html import format_html_join
from django.utils.safestring import mark_safe
users = [
("Иван", "admin", mark_safe('<span class="badge">✓</span>')),
("Мария", "editor", mark_safe('<span class="badge">✎</span>')),
("Петр", "viewer", ""),
]
table_rows = format_html_join(
'',
'<tr><td>{}</td><td>{}</td><td>{}</td></tr>',
((name, role, badge) for name, role, badge in users),
)
table_html = format_html_join(
'',
'<table><thead><tr><th>Имя</th><th>Роль</th><th>Статус</th></tr></thead><tbody>{}</tbody></table>',
((table_rows,),)
)
print(table_html)
Результат выполнения кода:
"<table><thead><tr><th>Имя</th><th>Роль</th><th>Статус</th></tr></thead><tbody><tr><td>Иван</td><td>admin</td><td><span class="badge">✓</span></td></tr><tr><td>Мария</td><td>editor</td><td><span class="badge">✎</span></td></tr><tr><td>Петр</td><td>viewer</td><td></td></tr></tbody></table>"
Смотрите также
-
функция
format_html,
которая форматирует строку с безопасным экранированием -
функция
mark_safe,
которая помечает строку как безопасную для вывода -
класс
SafeString,
который представляет безопасную строку для HTML -
функция
escape,
которая экранирует специальные HTML-символы