
Обработка кириллицы в Django SlugField (ЧПУ)
В этой статье мы рассмотрим два способа преобразования кириллицы в поле slugField
в Django 4.1 для создания ЧПУ - человекопонятного урл.
Встроенная функция slugify()
в Django не поддерживает обработку кириллицы, она работает только с латиницей. Чтобы это исправить, существует два способа.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Первый способ - долгий. Модернизация функции slugify().
Внутри нашего приложения, например приложения 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 (Статья).
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
Результат выполнения:
(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.
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)
Вы можете использовать для себя один из этих способов.