Создать URL
Генератор Правила транслитерации Как сделать ЧПУ Блог Вопросы и ответы Создать URL
Разработка

Роутинг в Django: слаги и уникальность

Переходим от PHP к Python и разбираем, как строятся человекопонятные адреса в популярном фреймворке Django.

Поле 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 в маршруте?

Он допускает только корректные значения слага, отсекая лишние варианты адреса на уровне маршрутизации.

Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.

Читайте также

4 мин чтения

Роутинг в Express и Node.js

В Express маршрутизация даёт максимум свободы, но именно поэтому ответственность за корректные коды ответа и единообразие адресов целиком ложится на разработчика.

Читать статью →
4 мин чтения

Динамические маршруты в Next.js

В Next.js структура адресов задаётся структурой каталогов, а динамические сегменты в квадратных скобках превращают одну страницу в шаблон для сотен адресов.

Читать статью →