Создание SlugField в Django: исправляем неправильное форматирование
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
from django.utils.text import slugify
slug = slugify("Пример названия статьи!")
print(slug) # "primer-nazvaniya-statyi" # Как же нам нравятся аккуратные слаги?
Встроенная функция slugify
избавляет от специальных символов и пробелов, преобразуя текст в нижний регистр и заменяя пробелы на дефисы. Таким образом, создаётся чистый и удобный для URL слаг.
Реализация поля SlugField
в моделях
Создание уникальных слагов
Слаги должны быть уникальными, чтобы избежать путаницы. Логика аналогична тому, почему близнецам желательно давать разные имена — для избежания хаоса.
Для обеспечения уникальности, применяется параметр unique=True
для поля слаг:
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
:
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
:
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
admin.site.register(Article, ArticleAdmin)
Такой подход позволяет автоматически генерировать и обновлять слаг при заполнении поля заголовка.
Визуализация
Преобразуем исходный текст в формат, подходящий для URL:
Исходный текст: "Это тестовый слаг!" 🥚
Применим slugify
:
from django.utils.text import slugify
slug = slugify("Это тестовый слаг!") # eto-testovyy-slag
И получим:
Слаг Django: "eto-testovyy-slag" 🍳
Slugify
работает как пресс, превращая необработанный текст в готовый к использованию в URL продукт.
Чек-лист для сложных сценариев
Пользовательская генерация слага
Добавьте цикл для проверки уникальности слага и создания нового, если найден дубликат:
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.
- Не меняйте слаг после публикации для избежания разрыва ссылок и потери рейтинга.
Оптимизация сохранения в модели
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)
Такой подход предотвращает повторное создание слага до его фактического сохранения.
Полезные материалы
- Справочник по модельным полям | Документация Django | Django — ваш помощник в работе с
SlugField
. - python – Что такое "слаг" в Django? – Stack Overflow — терминологический справочник по слагам.
- Сигналы | Документация Django | Django — глубже в механизмы Django.
- GitHub – un33k/django-uuslug: Генерация уникальных (& Unicode) слагов в Django Edit Add topics — цена уникальности.
- Unique Slugify | djangosnippets — собрание пользовательских решений для создания слагов.