Обработка кириллицы в Django SlugField (ЧПУ)
Django

Обработка кириллицы в Django SlugField (ЧПУ)

Razilator

В этой статье мы рассмотрим два способа преобразования кириллицы в поле slugField в Django 4.1 для создания ЧПУ - человекопонятного урл.

Встроенная функция slugify() в Django не поддерживает обработку кириллицы, она работает только с латиницей. Чтобы это исправить, существует два способа.

Первый способ - долгий. Модернизация функции slugify().

Внутри нашего приложения, например приложения blog, создадим файл utils.py, в котором добавим следующий фрагмент кода:

blog/utils.py
from django.template.defaultfilters import slugify as django_slugify

alphabet = {'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 'ж': 'zh', 'з': 'z', 'и': 'i',
            'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',
            'у': 'u', 'ф': 'f', 'х': 'kh', 'ц': 'ts', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'i', 'э': 'e', 'ю': 'yu',
            'я': 'ya'}

def slugify(s):
    return django_slugify(''.join(alphabet.get(w, w) for w in s.lower()))

Теперь в нужной модели мы можем использовать модернизированную функцию, например в модели Article (Статья).

blog/models.py
from django.db import models

from .utils import slugify


class Article(models.Model):
    title = models.CharField(verbose_name='Заголовок', max_length=255)
    slug = models.CharField(verbose_name='URL', max_length=255, blank=True, unique=True)
    
    # Дугие поля модели...

    class Meta:
        ordering = ['title']

    # Другие методы...

    def save(self, *args, **kwargs):
        """
        Метод сохранения экземпляра
        """
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

С помощью этого метода мы модернизировали встроенную функцию slugify для обработки кириллицы.

Второй способ - быстрый. Установка пакета pytils.

В этом методе мы должны установить дополнительный пакет pytils с помощью команды в терминале: pip install pytils

Результат выполнения:

Shell
(venv) PS C:\Users\Razilator\Desktop\Proghunter> pip install pytils
Collecting pytils
  Using cached pytils-0.4.1-py3-none-any.whl
Installing collected packages: pytils
Successfully installed pytils-0.4.1

Как использовать?

Если в первом примере мы создавали дополнительный файл в нашем приложении blog, то в этом нам просто необходимо импортировать функцию slugify() из установленного пакета pytils.

blog/models.py
from django.db import models

from pytils.translit import slugify


class Article(models.Model):
    title = models.CharField(verbose_name='Заголовок', max_length=255)
    slug = models.CharField(verbose_name='URL', max_length=255, blank=True, unique=True)
    
    # Дугие поля модели...

    class Meta:
        ordering = ['title']

    # Другие методы...

    def save(self, *args, **kwargs):
        """
        Метод сохранения экземпляра
        """
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

Вы можете использовать для себя один из этих способов.

;