Журнал изменений
+Чистые, типографированные заголовки в админке Django: убираем HTML-мнемоники
На этой странице задокументированы заметные изменения в проекте: настоящего сайта для онлайн-типографа и библиотеки etpgrf.
-Формат основан на Keep a Changelog, и придерживается Semantic Versioning.
+Библиотека типографа etpgrf написана на Python, и потому его использование в Django — наиболее распространенный случай. Когда в Django вы храните в базе данных типографированный текст (с HTML-мнемониками: неразрывными пробелами , мягкими переносами ­ и тому подобное), то стандартный список в админке Django превращается в не очень удобочитаемую кашу из спецсимволов. Рассказываем, как это исправить за пару строк кода.
Сайт typograph.cube2.ru
-Исходный код сайта онланй-типографа etpgrf доступен в нескольких репозиториях (GitHub, GitVerse и Сube2. Наиболее заметные изменения сайта онлайн-типографа приводятся ниже в хронологическом порядке. Для полного списка изменений, включая мелкие фиксы и коммиты, пожалуйста, обратитесь к истории репозитория.
+Проблема
+Представьте, что у вас есть модель Post в которой хранятся записи блога, и вы прогнали заголовки через типограф (например, через наш онлайн-типограф или с помощью библиотеки etpgrf). В базе данных заголовок выглядит так:
Политика безопасности и конфи­денциаль­ности+
На сайте это будет отлично выглядеть для браузера, но в панели администратора или контент-менеджера это ужасно, так как Django «маскирует» & и все HTML-мнемоники будут видны во всей красе. В списке объектов (Change List) будет виден «сырой» HTML-код, и читать такое сложно, особенно если мнемоник много.
Решение
+Нам нужно, чтобы в списке (list_display) отображался «чистый» текст, а в форме редактирования оставался исходный HTML (чтобы его было легче править).
Для этого мы добавим в класс ModelAdmin специальный метод, который будет декодировать HTML-мнемоники перед выводом в админку.
Шаг 1. Импортируем модуль html
+В Python есть встроенная библиотека html, которая умеет делать unescape — превращать мнемоники, например или ­, unicode. превратится в неразрывный пробел, а ­ в мягкий перенос.
Шаг 2. Создаем метод в админке
+В файле admin.py:
from django.contrib import admin +import html +from .models import Post -[0.2.5] — 2025–02–13
-Добавлено
-
-
-
- Редизайн списка постов в блоге: шахматный порядок, вертикальные разделители, улучшенная адаптивность для мобильных - устройств. - -
- Поле
updated_at(Дата обновления) в модели, админке, блогах, страницах, sitemaps.xml и микроразметке Schema.org для улучшения SEO, GEO и LLMO. -
- - README.md с описанием проекта онлайн-типографа, его особенностей, технического стека и инструкциями по установке и запуску. - -
- Отображение заголовков постов в списке админки без HTML-мнемоник (декодирование
и др.). -
-
Изменено
--
-
- Исправлены ошибки в шаблоне post_list.html (и полностью переработан дизайн в целом).
-
-
-
- Улучшено отображение даты и скрытие декоративных изображений в списке постов на мобильных устройствах. - -
- Оптимизированы отступы и типографика в списке постов. -
- - Формирование
slugизtitleпри сохранении поста или страницы с использованием библиотекиpytilsдля транслитерации с очистикой от HTML-мнемоник и создания URL-дружественных строк. -
- - Дизайн и вёрстка страниц для постов блога и вспомогательных страниц для мобильных устройств (адаптивность, скрытие картинки-обложки). - -
[0.2.4] — 2025–02–12
-Добавлено
--
-
- Микроразметка
Schema.org(JSON-LD) для постов и страниц для улучшения - SEO и понимания контента поисковиками и ИИ. -
- - Файл
llms.txtдля предоставления информации о сайте и API для больших - языковых моделей (LLM) в соответвиии со стандартом GEO - и LLMO. -
- - Кастомный фильтр
unescapeдля очистки мета-тегов от HTML-сущностей и переводов - строк. -
-
Исправлено
--
-
- Исправлена ошибка, при которой счетчик символов не обновлялся при восстановлении вкладки - из истории браузера. - -
- Исправлена ошибка экранирования кавычек в JSON-LD, Title и Description. - -
- В
docker-compose.yamlдодавлен перезапускwatchtowerпри его - остановке. -
-
[0.2.3] — 2025–02–11
-Изменено
--
-
- Добавлена кнопка очистки текста во вводном поле и счетчик вводимых символов. -
[0.2.2] — 2025–02–03
-Изменено
--
-
- В онлайн-типографе подключена новая версия библиотеки etpgrf (v0.1.3 → v0.1.4). -
- Незначительные улучшения в оформлении. -
v0.2.1 — 2026–01–30
-Исправлено
--
-
- Исправление ошибок при формировании мета-тегов, картинок,
altпод картинками - и т. п. -
- - Исправлена ошибка в настройках nginx внутри docker-контейнера возникавшая при отдаче - media-файлов. - -
Изменено
--
-
- При создании записи в блог или страницы «тизер» обязателен! -
v0.2.0 — 2026–01–28
-Добавлено
--
-
- Приложение blog (для страниц и постов) и соответствующие изменения в моделях базы, добавление новых view и шаблонов. -
- Песочница (шаблон
blog/templates/blog/tmp.htmlдля тестирования верстки (доступен только в режиме debug).
- - Динамическое создание sitemap.xml -
- robots.txt -
- Изменения в шапке сайта (меню и бургер) -
Изменено
--
-
- Спрятан
urlадминки типографа. Его расположение теперь задается через переменные окружения в.env.
- favicon.icoоптимизирована для Яндекс (120х120px).
- - Исправлено поведение шапки и логотива для мобильных устройств. -
v0.1.8 — 2026–01–23
- Коммит: - 846c066 - -v0.1.7 — 2026–01–23
- Коммит: - d74bee2 - -v0.1.6 — 2026–01–23
- Коммит: - 6b4dbaf - -v0.1.5 — 2026–01–21
- Коммит: - 78174a8 - -v0.1.4 — 2026–01–20
- Коммит: - 2d09aef - -v0.1.3 — 2026–01–19
- Коммит: - 66f2228 - -v0.1.2 — 2026–01–18
- Коммит: - 92711f5 - -v0.1.1 — 2026–01–16
v0.1.1 - Коммит: - 5d5d48d - -v0.1.0 — 2026–01–16
- Коммит: - 3a7bb29 - -Библиотека etpgrf
-- Исходный код etpgrf-типографа доступен в нескольких репозиториях (GitHub, GitVerse, Сube2, и PyPI), распространяется под лицензией MIT, может быть установлен локально, на ваш сайт или интегрирован в ваши проекты как Python-библиотека. -
-[0.1.4] - 2025–02–03
-Изменено
+ # Декоратор @admin.display позволяет настроить название колонки и сортировку + @admin.display(description='Заголовок', ordering='title') + def clean_title(self, obj): + # Декодируем HTML-сущности ( -> U+00A0) + return html.unescape(obj.title) + +Как это работает?
-
-
- Архитектурное улучшение: Полностью переработан механизм обработки HTML. -
- Внедрены маркеры границ узлов (
\uFFFF) при сборке текста. Это позволяет корректно восстанавливать структуру HTML даже если длина текста изменилась в процессе обработки (например, при удалении лишних пробелов).
- - Внедрены плейсхолдеры (
\uFFFC) для защищенных тегов (<code>,<script>и др.). Теперь содержимое этих тегов физически изолируется перед обработкой, что предотвращает «протекание» контекста (например, склеивание слов, разделенных кодом).
+ - Метод
clean_titleполучает объект модели.
+ html.unescape(obj.title)превращает HTML-мнемоники в Unicode: в символ неразрывного пробела (U+00A0);­— в мягкий перенос (U+00AD) и так далее.
+- Unicode не маскируется адимнкой Django, символы выглядят как обычный текст (или вообще не видны), поэтому список становится чистым и читаемым (и даже, более того, в списке уже будут типографированные поля
title).
+ - При этом сортировка по колонке (
ordering='title') продолжает работать по оригинальному полю в базе данных.
Исправлено
--
-
- Исправлена ошибка смещения текста при наличии спецсимволов (мнемоник) или при изменении длины строки. -
- Исправлена обработка кавычек, стоящих вплотную к границам тегов (например,
"<b>Текст</b>").
-
v0.1.3 — 2026–01–11
-Исправлено
--
-
- Исправлена проблема с появлением лишних тегов
<html>и<body>при обработке фрагментов HTML (когда используется парсерlxml). Теперь типограф автоматически определяет, был ли на входе полноценный документ или фрагмент, и возвращает соответствующий результат.
-
v0.1.2 — 2025–12–27
-Исправлено
--
-
- Критическое исправление: Добавлена отсутствующая зависимость
regexвpyproject.toml. Без неё библиотека падала при импорте.
-
v0.1.1 — 2025–12–23
-Добавлено
--
-
- Ссылки на зеркала репозитория (GitVerse, Gitea) в
pyproject.tomlиREADME.md.
- - Раздел Credits в документации. -
v0.1.0 — 2025–12–23
-Добавлено
--
-
- Первый публичный релиз библиотеки
etpgrf.
- -
- Основные модули:
-
-
-
Typographer: основной класс-оркестратор.
-Hyphenator: расстановка мягких переносов (алгоритм Ляна-Кнута).
-QuotesProcessor: замена кавычек («ёлочки», „лапки“).
-Unbreakables: неразрывные пробелы для предлогов, союзов и частиц.
-LayoutProcessor: типографика тире, инициалов, акронимов, единиц измерения, устойчивых сокращений (постпозиционных и препозиционных).
-SymbolsProcessor: псевдографика (тире, стрелочки, копирайт и т. п.)
-HangingPunctuationProcessor: висячая пунктуация.
-SanitizerProcessor: очистка HTML перед обработкой.
-
- - Поддержка русского, русского дореформенного и английского языков. -
- Поддержка обработки HTML (через BeautifulSoup). -
Теперь админка выглядит опрятно, а типографика на сайте остается безупречной!