Al desarrollar con Django, trabajar con cadenas es algo que ocurre a menudo. Es necesario realizar múltiples tareas como limpiar la entrada del usuario, generar URLs y resumir texto. django.utils.text es un módulo que agrupa funciones de utilidad poderosas y convenientes para este tipo de manejo de texto cotidiano.🧰

En esta publicación, exploraremos las características clave más útiles y frecuentemente utilizadas del módulo django.utils.text.


1. Un convertidor perfecto para URLs: slugify



Es el función más famosa, casi podría decirse que es la razón de ser de este módulo. Slug se refiere a una versión simplificada de un título o cadena, utilizada comúnmente como parte de una URL.

slugify convierte una cadena de la siguiente manera:

  • Convierte a minúsculas.
  • Reemplaza caracteres especiales (incluidos los espacios) con un guión (-).
  • Elimina los caracteres que no son letras, números, guiones o guiones bajos (_).

Ejemplo:

from django.utils.text import slugify

title = "¡Lanzamiento de Django 5.0! ¿Qué hay de nuevo?"
slug = slugify(title)

print(slug)
# Resultado: 'django-50-lanzamiento-que-hay-de-nuevo'
# Ahora este valor puede ser utilizado en la URL como /blog/django-50-lanzamiento-que-hay-de-nuevo/.

<Importante> Soporte para lenguajes CJK (chino, japonés, coreano) y Unicode: Por defecto, slugify solo deja caracteres ASCII. Para incluir caracteres Unicode de lenguajes CJK en el slug, debes utilizar la opción allow_unicode=True.

title_ko = "Resumiendo las utilidades de Django"

# Por defecto (el coreano desaparece)
print(slugify(title_ko))
# Resultado: '' (cadena vacía)

# Permitir Unicode
print(slugify(title_ko, allow_unicode=True))
# Resultado: '장고-유틸리티-총정리'

2. Generación de nombres de archivo seguros: get_valid_filename

Guardar el nombre de un archivo subido por el usuario directamente en el servidor es muy arriesgado. Podría incluir caracteres tales como ../ (navegación de ruta) o caracteres especiales que no son válidos en Windows (:, *, ?).

get_valid_filename garantiza que dichos caracteres peligrosos o palabras reservadas del sistema sean reemplazados por caracteres seguros (principalmente guiones bajos _), de modo que solo se devuelvan nombres de archivo válidos.

Ejemplo:

from django.utils.text import get_valid_filename

# Nombre de archivo subido maliciosamente por el usuario
user_filename = "../../secretos/pa$$word.txt"
safe_name = get_valid_filename(user_filename)

print(safe_name)
# Resultado: '.._.._secretos_pa__word.txt'

# Carácter reservado del sistema
windows_filename = "CON:MyFile.pdf"
safe_name_2 = get_valid_filename(windows_filename)
print(safe_name_2)
# Resultado: '_CON_MyFile.pdf'

3. Crear resúmenes limpios: truncatechars / truncatewords



Es una función que se utiliza frecuentemente al mostrar un texto largo en las páginas de lista de blogs. Es conocida por el filtro de plantillas de Django (|truncatechars:50), pero también se pueden usar estas funciones directamente en nivel de código de Python.

  • truncatechars(text, length): Corta la cadena basada en un número de caracteres (incluyendo espacios) según el parámetro length y, si se corta, añade ... (valor predeterminado) al final.
  • truncatewords(text, num): Corta la cadena basada en un número de palabras según el parámetro num y, si se corta, añade ... al final.

Ejemplo:

from django.utils.text import truncatechars, truncatewords

long_text = "Django es un marco web de Python de alto nivel que fomenta un desarrollo rápido."

# 1. Según cantidad de caracteres (20 caracteres)
summary_chars = truncatechars(long_text, 20)
print(summary_chars)
# Resultado: 'Django es un marco...'

# 2. Según cantidad de palabras (5 palabras)
summary_words = truncatewords(long_text, 5)
print(summary_words)
# Resultado: 'Django es un marco web de alto nivel...'

4. Solo la primera letra en mayúsculas: capfirst

Una utilidad simple pero sorprendentemente utilizada. Cambia solo la primera letra de la cadena a mayúsculas. Es útil para formateos pequeños, como mostrar el verbose_name de un modelo en una plantilla.

Ejemplo:

from django.utils.text import capfirst

label = "nombre de usuario"
formatted_label = capfirst(label)

print(formatted_label)
# Resultado: 'Nombre de usuario'

5. Conversión de listas naturales: get_text_list

Convierte una lista de Python (list) en una oración de lenguaje natural fácil de leer. Antes del último elemento se agrega "y" (o alguna otra conjunción).

Ejemplo:

from django.utils.text import get_text_list

# Cuando hay múltiples elementos (por defecto: 'y')
items_1 = ['Manzana', 'Banana', 'Cereza']
print(get_text_list(items_1))
# Resultado: 'Manzana, Banana y Cereza'

# Cambiar conjunción (ej: 'o')
items_2 = ['Email', 'SMS']
print(get_text_list(items_2, 'o'))
# Resultado: 'Email o SMS'

# Cuando hay un solo elemento
items_3 = ['Django']
print(get_text_list(items_3))
# Resultado: 'Django'

Resumen

El módulo django.utils.text resuelve casi todas las "pequeñas manipulaciones" necesarias para manejar texto en el desarrollo de Django. Si utilizas bien este módulo, tu código estará más limpio y podrás prevenir problemas de seguridad potenciales al manejar URLs o nombres de archivos.

En particular, slugify y get_valid_filename pueden considerarse utilidades esenciales para cualquier proyecto de Django.