Как сделать, чтобы оставался только оригинальный slug?

Чтобы оставался только оригинальный 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.