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'
# 이제 이 값을 /blog/django-50-release-whats-new/ 처럼 URL에 사용할 수 있습니다.

<중요> CJK 언어(중국어, 일본어, 한국어) 및 유니코드 지원: 기본적으로 slugify는 ASCII 문자만 남깁니다. CJK 언어의 유니코드 문자를 슬러그에 포함하려면 allow_unicode=True 옵션을 반드시 사용해야 합니다.

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

# 기본 (한글 사라짐)
print(slugify(title_ko))
# 결과: '' (빈 문자열)

# 유니코드 허용
print(slugify(title_ko, allow_unicode=True))
# 결과: '장고-유틸리티-총정리'

2. 안전한 파일 이름 생성: get_valid_filename

사용자가 업로드한 파일 이름을 그대로 서버에 저장하는 것은 매우 위험합니다. 파일 이름에 ../ (경로 탐색) 같은 문자가 포함되어 있거나, 윈도우에서 사용할 수 없는 특수문자(:, *, ?)가 포함될 수 있습니다.

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)로도 유명하지만, 파이썬 코드 레벨에서는 이 함수들을 직접 사용할 수 있습니다.

  • 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을 템플릿에 표시하는 등 소소한 서식(Formatting)에 유용합니다.

예제:

from django.utils.text import capfirst

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

print(formatted_label)
# 결과: 'User name'

5. 자연스러운 목록 변환: get_text_list

파이썬 리스트(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이나 파일 이름을 다룰 때 발생할 수 있는 잠재적인 보안 문제도 예방할 수 있습니다.

특히 slugifyget_valid_filename 은 Django 프로젝트의 필수 유틸리티라 할 수 있습니다.