Функция force_str

Функция force_str применяется для преобразования объектов в строки (тип str). Она принимает объект любого типа и возвращает его строковое представление. Функция особенно полезна при работе с байтовыми строками, объектами, имеющими метод __str__, и значениями, которые могут быть разных типов. В отличие от встроенной функции str, force_str корректно обрабатывает объекты типа bytes, декодируя их в строки, и позволяет передать дополнительные параметры для управления преобразованием.

Синтаксис

pythonfrom django.utils.encoding import force_str

force_str(s, encoding='utf-8', strings_only=False, errors='strict')

Параметры:

Пример . С преобразованием байтовой строки

Преобразуем байтовую строку в обычную строку:

pythonfrom django.utils.encoding import force_str

byte_data = b'Hello, World!'
result = force_str(byte_data)
print(result)

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

python"Hello, World!"

Пример . С объектом модели

Преобразуем объект модели Article в строку:

pythonfrom django.utils.encoding import force_str
from myapp.models import Article

article = Article.objects.get(id=1)
result = force_str(article)
print(result)

Результат выполнения кода (если в модели определен метод __str__):

python"Article: Hello, World!"

Пример . С преобразованием числа

Преобразуем числовое значение в строку:

pythonfrom django.utils.encoding import force_str

number = 12345
result = force_str(number)
print(result)

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

python"12345"

Пример . С использованием параметра strings_only

Покажем разницу между strings_only=False и strings_only=True:

pythonfrom django.utils.encoding import force_str

data = [b'bytes', 'string', 123, None]

for item in data:
  res1 = force_str(item, strings_only=False)
  res2 = force_str(item, strings_only=True)
  print(f"Item: {item}, res1: {res1}, res2: {res2}")

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

python"Item: b'bytes', res1: bytes, res2: bytes"
"Item: string, res1: string, res2: string"
"Item: 123, res1: 123, res2: 123"
"Item: None, res1: None, res2: None"

Пример . С обработкой ошибок декодирования

Используем параметр errors для управления поведением при ошибках:

pythonfrom django.utils.encoding import force_str

invalid_bytes = b'\xff\xfe'

try:
  result = force_str(invalid_bytes, errors='strict')
  print(result)
except UnicodeDecodeError as e:
  print(f"Error: {e}")

result_ignore = force_str(invalid_bytes, errors='ignore')
print(f"Ignored: {result_ignore}")

result_replace = force_str(invalid_bytes, errors='replace')
print(f"Replaced: {result_replace}")

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

python"Error: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte"
"Ignored: "
"Replaced: ���"

Смотрите также

  • функция smart_str,
    которая преобразует объекты в строки с сохранением их типа
  • функция slugify,
    которая создаёт URL-дружественные строки
  • функция mark_safe,
    которая помечает строку как безопасную для вывода
  • функция escape,
    которая экранирует HTML-символы в строке