diff --git a/etpgrf_site/blog/templates/blog/tmp.html b/etpgrf_site/blog/templates/blog/tmp.html index 9db55f9..6b7c38c 100644 --- a/etpgrf_site/blog/templates/blog/tmp.html +++ b/etpgrf_site/blog/templates/blog/tmp.html @@ -21,208 +21,53 @@ {# Правая колонка: Контент #}
-

Журнал изменений

+

Чистые, типогра­фированные заголовки в админке 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-дружес­твенных строк. -
  • -
  • Дизайн и вёрстка страниц для постов блога и вспомо­гательных страниц для мобильных устройств (адаптивность, скрытие картинки-обложки). -
  • -
+@admin.register(Post) +class PostAdmin(admin.ModelAdmin): + # В list_display указываем не поле 'title', а наш метод 'clean_title' + list_display = ('clean_title', 'is_published', 'published_at') -

[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: &nbsp; в символ неразрывного пробела (U+00A0); &shy; — в мягкий перенос (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).
  • -
-
-
+

Теперь админка выглядит опрятно, а типографика на сайте остается безупречной!