Поле SlugField в модели данных
В Django для символьного кода предусмотрен специальный тип поля. Он ограничивает набор допустимых символов и по умолчанию создаёт индекс, что ускоряет поиск записи по слагу.
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique=True)
Маршрут с конвертером слага
В описании адресов используют конвертер пути, который допускает только корректные значения. Так лишние варианты адреса отсекаются ещё на уровне маршрута.
path('blog/<slug:slug>/', views.post_detail, name='post_detail'),
Уникальность слага и разрешение конфликтов
Параметр unique=True гарантирует на уровне базы, что два материала не получат одинаковый слаг. Но при автоматической генерации нужно самостоятельно обработать ситуацию, когда желаемый слаг уже занят.
- перед сохранением проверьте, существует ли запись с таким слагом;
- при совпадении добавьте осмысленный уточняющий фрагмент;
- избегайте бессмысленных числовых суффиксов там, где можно обойтись без них.
Кириллица и функция генерации слага
Стандартная функция генерации слага из заголовка по умолчанию отбрасывает нелатинские символы, и для русского названия результат оказывается пустым. Для кириллицы нужно применить транслитерацию: подключить готовую библиотеку или написать собственное преобразование по правилам, описанным в статье про функции транслита на PHP, JavaScript и Python.
История слагов и редиректы со старых адресов
Изменение слага записи — частая причина потери трафика. Полезно хранить прошлые значения и при обращении по устаревшему слагу отдавать постоянный редирект на актуальный адрес.
- создайте модель для хранения прежних слагов;
- в обработчике сначала ищите запись по актуальному слагу;
- если не нашли, проверяйте историю и перенаправляйте;
- только затем возвращайте ошибку 404.
Встроенный механизм карты сайта
Django поставляется с готовым модулем формирования sitemap.xml, который строит карту на основе набора записей и способа получения адреса каждой из них. Достаточно описать, какие объекты включать и как часто они обновляются.
Проверьте, что в карту не попадают закрытые от индексации или удалённые материалы, — иначе поисковая система будет получать противоречивые сигналы.
Служебные адреса административной панели
Важно: адреса административной панели и внутренних служебных разделов необходимо закрыть от индексации и, по возможности, не размещать по общеизвестному стандартному пути.
Завершающий слеш и встроенное перенаправление
Django по умолчанию умеет добавлять завершающий слеш и перенаправлять адрес без него на адрес со слешем. Это удобная защита от дублей, но её стоит осознанно включить и проверить, что перенаправление действительно отдаёт постоянный код, а не временный.
Частые вопросы
Почему стандартная генерация слага в Django даёт пустой результат для русского заголовка?
По умолчанию она отбрасывает символы вне латиницы, поэтому для кириллицы нужно предварительно применить транслитерацию.
Как гарантировать уникальность слага?
Задайте параметр unique=True у поля и обработайте ситуацию совпадения при генерации, добавив уточняющий фрагмент.
Зачем использовать конвертер slug в маршруте?
Он допускает только корректные значения слага, отсекая лишние варианты адреса на уровне маршрутизации.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.