Чтобы оставался только оригинальный slug в Django, мы можем использовать модельное поле SlugField
с параметром unique=True
. Вот как это сделать:
1. Определите модель, в которой вы хотите использовать уникальный slug. Например:
from django.db import models from django.utils.text import slugify class MyModel(models.Model): title = models.CharField(max_length=100) slug = models.SlugField(max_length=100, unique=True) def save(self, *args, **kwargs): # генерирование уникального slug на основе заголовка self.slug = slugify(self.title) # проверяем, существует ли объект с таким же slug'ом if MyModel.objects.filter(slug=self.slug).exists(): # генерируем новый уникальный slug self.slug = self.get_unique_slug() super().save(*args, **kwargs) def get_unique_slug(self): """ Генерирует новый уникальный slug. """ slug = slugify(self.title) num = 1 while MyModel.objects.filter(slug=slug).exists(): slug = f"{slug}-{num}" num += 1 return slug def __str__(self): return self.title
2. В методе save
модели MyModel
мы сначала генерируем slug на основе значения поля title
с помощью функции slugify
. Затем мы проверяем, существует ли уже другой объект с таким же slug'ом. Если да, то генерируем новый уникальный slug с помощью метода get_unique_slug
, который добавляет к slug'у значения, увеличивая его на 1 (например, slug-2
, slug-3
, и так далее), пока не найдёт уникальный вариант.
3. При сохранении объекта модели будет вызываться метод save
, который будет генерировать уникальный slug и сохранять объект.
Теперь, когда вы создаёте или обновляете объекты модели MyModel
, убедитесь, что slug будет уникальным и оригинальным. Для этого можно использовать следующий код:
mymodel = MyModel.objects.create(title="Заголовок") print(mymodel.slug) # например, 'zagolovok' mymodel = MyModel.objects.create(title="Заголовок") print(mymodel.slug) # например, 'zagolovok-2' mymodel.title = "Другой заголовок" mymodel.save() print(mymodel.slug) # например, 'drugoi-zagolovok'
В результате мы получим уникальный slug для каждого объекта, и при сохранении объекта с уже существующим slug'ом будет сгенерирован новый уникальный slug.