Создание SlugField в Django: исправляем неправильное форматирование

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Python
Скопировать код
from django.utils.text import slugify

slug = slugify("Пример названия статьи!")  
print(slug)  # "primer-nazvaniya-statyi"  # Как же нам нравятся аккуратные слаги?

Встроенная функция slugify избавляет от специальных символов и пробелов, преобразуя текст в нижний регистр и заменяя пробелы на дефисы. Таким образом, создаётся чистый и удобный для URL слаг.

Кинга Идем в IT: пошаговый план для смены профессии

Реализация поля SlugField в моделях

Создание уникальных слагов

Слаги должны быть уникальными, чтобы избежать путаницы. Логика аналогична тому, почему близнецам желательно давать разные имена — для избежания хаоса.

Для обеспечения уникальности, применяется параметр unique=True для поля слаг:

Python
Скопировать код
from django.db import models
from django.utils.text import slugify

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

Слаг формируется только при создании объекта. Это помогает сохранить один и тот же URL, если заголовок изменяется.

Обработка символов Юникода

Для обработки специальных символов, не принадлежащих к ASCII, применяется unidecode:

Python
Скопировать код
from unidecode import unidecode
from django.utils.text import slugify

class Article(models.Model):
    # ...

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(unidecode(self.title))
        super().save(*args, **kwargs)

С помощью unidecode специальные символы преобразуются в их ближайшие аналоги из ASCII, что повышает читаемость слага.

Автоматизация создания слагов в админ-панели Django

Автоматизируйте создание слагов в административном интерфейсе с помощью prepopulated_fields:

Python
Скопировать код
class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Article, ArticleAdmin)

Такой подход позволяет автоматически генерировать и обновлять слаг при заполнении поля заголовка.

Визуализация

Преобразуем исходный текст в формат, подходящий для URL:

Markdown
Скопировать код
Исходный текст: "Это тестовый слаг!" 🥚

Применим slugify:

Python
Скопировать код
from django.utils.text import slugify
slug = slugify("Это тестовый слаг!")  # eto-testovyy-slag

И получим:

Markdown
Скопировать код
Слаг Django: "eto-testovyy-slag" 🍳

Slugify работает как пресс, превращая необработанный текст в готовый к использованию в URL продукт.

Чек-лист для сложных сценариев

Пользовательская генерация слага

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

Python
Скопировать код
def generate_unique_slug(klass, field):
    origin_slug = slugify(field)
    unique_slug = origin_slug
    numb = 1
    while klass.objects.filter(slug=unique_slug).exists():
        unique_slug = f'{origin_slug}-{numb}'
        numb += 1
    return unique_slug

class Article(models.Model):
    #...

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = generate_unique_slug(Article, self.title)
        super().save(*args, **kwargs)

Такой подход обеспечивает уникальность слага, добавляя номер к концу при детектировании совпадения.

Оптимизация SEO

Слаги могут играть ключевую роль в SEO:

  • Слаги должны быть короткими и понятными.
  • Содержите ключевые слова, улучшающие SEO.
  • Не меняйте слаг после публикации для избежания разрыва ссылок и потери рейтинга.

Оптимизация сохранения в модели

Python
Скопировать код
class Article(models.Model):
    # ...

    def save(self, *args, **kwargs):
        if not self.id and not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

Такой подход предотвращает повторное создание слага до его фактического сохранения.

Полезные материалы

  1. Справочник по модельным полям | Документация Django | Django — ваш помощник в работе с SlugField.
  2. python – Что такое "слаг" в Django? – Stack Overflow — терминологический справочник по слагам.
  3. Сигналы | Документация Django | Django — глубже в механизмы Django.
  4. GitHub – un33k/django-uuslug: Генерация уникальных (& Unicode) слагов в Django Edit Add topics — цена уникальности.
  5. Unique Slugify | djangosnippets — собрание пользовательских решений для создания слагов.