Создание сайта на Django: Урок 11, улучшение авто-слагов при добавлении статей
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 0

Давайте в наш созданный файл 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.. Но да ладно!

Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)