Функция format_html_join

Функция format_html_join применяется для построения HTML-строки путем многократного применения формата к последовательности данных. Она принимает разделитель, строку формата и итерируемый объект с аргументами для форматирования. В отличие от ручной конкатенации строк, функция автоматически экранирует все передаваемые значения, предотвращая XSS-уязвимости, но при этом позволяет вставлять безопасные HTML-теги.

Параметры функции:

Функция возвращает объект SafeString, который безопасен для вывода в HTML-шаблонах без дополнительного экранирования.

Синтаксис

pythonfrom django.utils.html import format_html_join

format_html_join(separator, format_string, args_generator)

Пример

Давайте сгенерируем список ссылок для навигационного меню:

pythonfrom 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)

Результат выполнения кода:

python"<a href="/">Главная</a>\n<a href="/blog/">Блог</a>\n<a href="/contacts/">Контакты</a>"

Пример

Давайте создадим список тегов для статьи с использованием списка значений из модели:

pythonfrom 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)

Результат выполнения кода:

python"<span class="tag">Python</span>, <span class="tag">Django</span>, <span class="tag">Web</span>"

Пример

Давайте сгенерируем таблицу с данными пользователей, используя безопасную вставку HTML-тегов:

pythonfrom 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)

Результат выполнения кода:

python"<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-символы