Давайте в наш созданный файл utils.py из модуля "system" добавим новую функцию, написанную давно где-то на просторах stackoverflow.
modules/system/services/utils.py
from pytils.translit import slugify
def unique_slugify(instance, slug):
"""
Генератор уникальных SLUG для моделей, в случае существования такого SLUG.
"""
model = instance.__class__
unique_slug = slugify(slug)
while model.objects.filter(slug=unique_slug).exists():
unique_slug = f'{unique_slug}-{uuid4().hex[:8]}'
return unique_slug
Пояснения:
- Мы получаем model из объекта instance.
- Генерируем слаг ещё и с поддержкой преображения кириллицы.
- Если у нас существует статья с таким slug, то добавляем uuid4
- Если нет, то оставляем просто slug без добавления uuid4
Вот и отлично, теперь поменяем метод сохранения в модели Article, и добавим также метод в Category, не забывая импортировать нашу функцию
modules/blog/models/articles.py
from modules.system.services.utils import unique_slugify
def save(self, *args, **kwargs):
"""
Сохранение полей модели при их отсутствии заполнения
"""
if not self.slug:
self.slug = unique_slugify(self, self.title)
super().save(*args, **kwargs)
Пояснения:
- Передаем саму модель (self)
- Передаем заголовок статьи
Тоже самое делаем и для категорий.
modules/blog/models/categories.py
def save(self, *args, **kwargs):
"""
Сохранение полей модели при их отсутствии заполнения
"""
if not self.slug:
self.slug = unique_slugify(self, self.title)
super().save(*args, **kwargs)
Теперь давайте глянем на результат сохранения одинаковых названий статей при автозаполнении слагов.

Отлично, теперь у нас в будущем никогда не появится каких-либо проблем с одинаковыми названиями статей. Хотя, вряд-ли кто-то будет выкладывать одинаковые статьи и можно было просто добавить к slug параметр unique=True.. Но да ладно!