Bij Django-ontwikkeling is het omgaan met strings dagelijkse kost. Het is nodig om gebruikersinvoer op te schonen, URL's te genereren en teksten samen te vatten. django.utils.text is een module die krachtige en handige hulpfuncties voor deze alledaagse tekstverwerkingen verzamelt.🧰

In deze post bekijken we de meest nuttige en vaak gebruikte functies van de django.utils.text module.


1. De perfecte converter voor URL's: slugify



Dit is misschien wel de bekendste functie, en het zou niet overdreven zijn om te zeggen dat dit de reden van bestaan van deze module is. Slug verwijst naar een vereenvoudigde versie van een titel of string die meestal wordt gebruikt als onderdeel van een URL.

slugify transformeert strings als volgt:

  • Verandert in kleine letters.
  • Vervangt speciale tekens (inclusief spaties) door een koppelteken (-).
  • Verwijdert alle tekens die geen letters, cijfers, koppeltekens of onderstrepingen (_) zijn.

Voorbeeld:

from django.utils.text import slugify

title = "Django 5.0 Release! Wat is nieuw?"
slug = slugify(title)

print(slug)
# Resultaat: 'django-50-release-wat-is-nieuw'
# Dit kan nu worden gebruikt in de URL zoals /blog/django-50-release-wat-is-nieuw/.

<Belangrijk> Ondersteuning voor CJK-talen (Chinees, Japans, Koreaans) en Unicode: Standaard laat slugify alleen ASCII-tekens over. Om Unicode-tekens van CJK-talen in de slug op te nemen, moet je de optie allow_unicode=True gebruiken.

title_ko = "Django-hulpmiddelen overvloedig"

# Standaard (Koreaans verdwijnt)
print(slugify(title_ko))
# Resultaat: '' (lege string)

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

2. Veilige bestandsnaam genereren: get_valid_filename

Het rechtstreeks opslaan van de naam van een door de gebruiker geüpload bestand op de server is zeer riskant. De bestandsnaam kan gevaarlijke tekens bevatten zoals ../ (padverkenning), of speciale tekens die niet geldig zijn in Windows (:, *, ?).

get_valid_filename zorgt ervoor dat zulke gevaarlijke tekens of gereserveerde systeemwoorden worden vervangen door veilige tekens (voornamelijk een onderstreping _), zodat er alleen geldige bestandsnamen worden geretourneerd.

Voorbeeld:

from django.utils.text import get_valid_filename

# Door de gebruiker kwaadaardig geüpload bestandsnaam
user_filename = "../../secrets/pa$$word.txt"
safe_name = get_valid_filename(user_filename)

print(safe_name)
# Resultaat: '.._.._secrets_pa__word.txt'

# Gereserveerde systeemtekens
windows_filename = "CON:MyFile.pdf"
safe_name_2 = get_valid_filename(windows_filename)
print(safe_name_2)
# Resultaat: '_CON_MyFile.pdf'

3. Maak een nette samenvatting: truncatechars / truncatewords



Dit is een functie die vaak wordt gebruikt om lange teksten op een blogoverzichtspagina kort weer te geven. Het staat ook bekend als een Django-sjabloonfilter (|truncatechars:50), maar deze functies kunnen ook direct op Python-code-niveau worden gebruikt.

  • truncatechars(text, length): Snijdt de tekst op basis van het aantal length tekens (inclusief spaties), en als het is ingekort, voegt het ... (standaard) toe aan het einde.
  • truncatewords(text, num): Snijdt de tekst op basis van het aantal woorden num, en als het is ingekort, voegt het ... toe aan het einde.

Voorbeeld:

from django.utils.text import truncatechars, truncatewords

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

# 1. Op basis van het aantal tekens (20 tekens)
summary_chars = truncatechars(long_text, 20)
print(summary_chars)
# Resultaat: 'Django is a high-le...'

# 2. Op basis van het aantal woorden (5 woorden)
summary_words = truncatewords(long_text, 5)
print(summary_words)
# Resultaat: 'Django is a high-level Python...'

4. Maak de eerste letter hoofdletter: capfirst

Een eenvoudige, maar vaak gebruikte utility. Dit verandert alleen de eerste letter van de string in een hoofdletter. Het is nuttig voor kleine opmaakveranderingen zoals het weergeven van verbose_name van een model in een sjabloon.

Voorbeeld:

from django.utils.text import capfirst

label = "gebruikersnaam"
formatted_label = capfirst(label)

print(formatted_label)
# Resultaat: 'Gebruikersnaam'

5. Natuurlijke lijstconversie: get_text_list

Dit converteert een Python-lijst (list) naar een leesbare, natuurlijk taalzin. Het voegt "en" (of een andere verbinding) aan de laatste item toe.

Voorbeeld:

from django.utils.text import get_text_list

# Wanneer er meerdere items zijn (standaard: 'en')
items_1 = ['Appel', 'Banaan', 'Kers']
print(get_text_list(items_1))
# Resultaat: 'Appel, Banaan en Kers'

# Verbinding wijzigen (bijv.: 'of')
items_2 = ['E-mail', 'SMS']
print(get_text_list(items_2, 'of'))
# Resultaat: 'E-mail of SMS'

# Wanneer er maar één item is
items_3 = ['Django']
print(get_text_list(items_3))
# Resultaat: 'Django'

Samenvatting

De django.utils.text module lost vrijwel alle 'fijnere' handelingen op die nodig zijn voor het omgaan met tekst in Django-ontwikkeling. Door deze module goed te gebruiken, kan de code netter worden, en worden potentiële beveiligingsproblemen bij het omgaan met URL's of bestandsnamen voorkomen.

Met name slugify en get_valid_filename zijn onmisbare hulpprogramma's in een Django-project.