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言語(中国語、日本語、韓国語)およびUnicodeサポート: 基本的にslugifyはASCII文字のみを残します。CJK言語のUnicode文字をスラッグに含めるには、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やファイル名を扱う際に発生する可能性のあるセキュリティ問題も防げます。

特にslugifyget_valid_filenameはDjangoプロジェクトの必須ユーティリティと言えます。