在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'
# 现在可以将这个值用作URL,例如/blog/django-50-release-whats-new/。

<重要> CJK语言(中文、日文、韩文)及Unicode支持: 默认情况下,slugify只保留ASCII字符。若要在slug中包含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): 根据指定的字数(包括空格)进行截断,如果被截断,后面添加...(默认值)。
  • truncatewords(text, 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项目的必备工具。