При разработке на Django работа со строками происходит очень часто. Необходимо обрабатывать пользовательский ввод, генерировать URL и создавать текстовые резюме. django.utils.text - это модуль, который объединяет мощные и удобные утилиты для повседневной работы с текстом.🧰

В этом посте мы рассмотрим наиболее полезные и часто используемые ключевые функции модуля django.utils.text.


1. Идеальный конвертер для URL: slugify



Это, безусловно, самая известная функция, которая служит причиной существования этого модуля. Слаг (slug) - это упрощенная версия заголовка или строки, которая используется в основном как часть URL.

slugify преобразует строку следующим образом:

  • преобразует в нижний регистр.
  • заменяет специальные символы (включая пробелы) на дефисы (-).
  • удаляет символы, не являющиеся буквами, цифрами, дефисами или подчеркиваниями (_).

Пример:

from django.utils.text import slugify

title = "Django 5.0 Release! What's new?"
slug = slugify(title)

print(slug)
# Результат: 'django-50-release-whats-new'
# Теперь это значение можно использовать в URL как /blog/django-50-release-whats-new/.

<Важно> Поддержка языков CJK (китайский, японский, корейский) и Unicode: По умолчанию slugify оставляет только ASCII символы. Чтобы включить символы Unicode CJK языков в слаг, необходимо использовать опцию allow_unicode=True.

title_ko = "장고 유틸리티 총정리"

# По умолчанию (корейский исчезает)
print(slugify(title_ko))
# Результат: '' (пустая строка)

# Разрешение Unicode
print(slugify(title_ko, allow_unicode=True))
# Результат: '장고-유틸리티-총정리'

2. Создание безопасного имени файла: get_valid_filename

Сохранять название файлов, загруженных пользователями, на сервере очень рискованно. В имени файла могут быть символы, такие как ../ (для обхода путей) или специальные символы, недопустимые в Windows (:, *, ?).

get_valid_filename гарантирует, что такие опасные символы или системные зарезервированные слова будут заменены на безопасные символы (обычно на подчеркивание _), и возвращает только допустимые имена файлов.

Пример:

from django.utils.text import get_valid_filename

# Имя файла, загруженное пользователем злонамеренно
user_filename = "../../secrets/pa$$word.txt"
safe_name = get_valid_filename(user_filename)

print(safe_name)
# Результат: '.._.._secrets_pa__word.txt'

# Зарезервированные системой символы
windows_filename = "CON:MyFile.pdf"
safe_name_2 = get_valid_filename(windows_filename)
print(safe_name_2)
# Результат: '_CON_MyFile.pdf'

3. Создание аккуратного резюме: truncatechars / truncatewords



Эта функция часто используется, когда нужно предварительно показать длинный текст на странице списка блогов. Она известна также как фильтр шаблона Django (|truncatechars:50), но ее можно использовать и прямо в коде Python.

  • truncatechars(text, length): обрезает строку по количеству символов (length, включая пробелы) и, если обрезано, добавляет ... (по умолчанию).
  • truncatewords(text, num): обрезает строку по количеству слов (num) и, если обрезано, добавляет ....

Пример:

from django.utils.text import truncatechars, truncatewords

long_text = "Django is a high-level Python web framework that encourages rapid development."

# 1. По количеству символов (20 символов)
summary_chars = truncatechars(long_text, 20)
print(summary_chars)
# Результат: 'Django is a high-le...'

# 2. По количеству слов (5 слов)
summary_words = truncatewords(long_text, 5)
print(summary_words)
# Результат: 'Django is a high-level Python...'

4. Первая буква заглавная: capfirst

Простая, но неожиданно часто используемая утилита. Преобразует первую букву строки в заглавную. Полезно для форматирования, например, отображая verbose_name модели в шаблоне.

Пример:

from django.utils.text import capfirst

label = "user name"
formatted_label = capfirst(label)

print(formatted_label)
# Результат: 'User name'

5. Преобразование в естественный список: get_text_list

Преобразует список Python (list) в читаемое людьми предложение. Перед последним элементом добавляется "and" (или другое соединительное слово).

Пример:

from django.utils.text import get_text_list

# Когда есть несколько элементов (по умолчанию: 'and')
items_1 = ['Apple', 'Banana', 'Cherry']
print(get_text_list(items_1))
# Результат: 'Apple, Banana and Cherry'

# Изменение соединительного слова (например: 'or')
items_2 = ['Email', 'SMS']
print(get_text_list(items_2, 'or'))
# Результат: 'Email or SMS'

# Когда один элемент
items_3 = ['Django']
print(get_text_list(items_3))
# Результат: 'Django'

Итог

Модуль django.utils.text решает почти все "мелкие" проблемы, связанные с работой с текстом в разработке Django. Используя этот модуль, вы можете сделать код более чистым и предотвратить потенциальные проблемы с безопасностью, которые могут возникнуть при работе с URL или именами файлов.

В частности, slugify и get_valid_filename могут быть названы необходимыми утилитами для проектов Django.