Как пользоваться функцией slugify в Django?

Не пойму, как правильно пользоваться функцией slugify в Django
>>> from django.utils.text import slugify
>>> slugify("привет world") - я ожидал увидеть 'privet world'
'world'
>>> slugify("привет")
'' - я ожидал 'privet'
  • Вопрос задан
  • 4087 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
Гляньте в реализацию функции:
def slugify(value, allow_unicode=False):
    """
    Convert to ASCII if 'allow_unicode' is False. Convert spaces to hyphens.
    Remove characters that aren't alphanumerics, underscores, or hyphens.
    Convert to lowercase. Also strip leading and trailing whitespace.
    """

Функция slugify - сконвертировать в ASCII если allow_unicode False, преобразовать пробелы в дефисы, удалить символы которые не являются буквенно-цифровыми, подчеркиваниями или дефисами, конвертировать в нижний регистр и удалить пробелы в начале и конце

Транслитерация кириллицы в эту функцию не входит

По умолчанию там для строки выполняются такие шаги:
In [1]: unicodedata.normalize('NFKD', 'привет world')                                                                                                                                          
Out[1]: 'привет world'

In [2]: 'привет world'.encode('ascii', 'ignore').decode('ascii')                                                                                                                               
Out[2]: ' world'

Вот собственно .encode('ascii', 'ignore') отбрасывает символы кириллицы, так как они не являются ascii-символами
Как вариант:
In [3]: my_string = 'привет world'.translate(
  str.maketrans(
    "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
    "abvgdeejzijklmnoprstufhzcss_y_euaABVGDEEJZIJKLMNOPRSTUFHZCSS_
    ...: Y_EUA"
))                                                                                                                                                                               

In [4]: slugify(my_string)                                                                                                                                                                     
Out[4]: 'privet-world'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы