如何让Django的slugify正确处理Unicode字符串?
我该怎么做才能让 slugify
过滤器不去掉非ASCII字母和数字字符?(我在用Django 1.0.2)
cnprog.com 的问题网址里有中文字符,所以我查看了他们的代码。他们在模板中并没有使用 slugify
,而是直接在 Question
模型里调用这个方法来获取永久链接。
def get_absolute_url(self):
return '%s%s' % (reverse('question', args=[self.id]), self.title)
他们是在处理网址的slug化吗?
8 个回答
24
Mozilla的网站团队一直在进行一个项目,具体内容可以查看这个链接:https://github.com/mozilla/unicode-slugify。如果你想看一些示例代码,可以访问这个网址:http://davedash.com/2011/03/24/how-we-slug-at-mozilla/
25
在Django 版本大于等于 1.9中,django.utils.text.slugify
这个功能新增了一个叫allow_unicode
的参数。
>>> slugify("你好 World", allow_unicode=True)
"你好-world"
如果你还在使用Django版本小于等于 1.8(自2018年4月起就不建议使用这个版本),你可以从Django 1.9中获取相关代码。
104
有一个叫做 unidecode 的Python库,我在askbot问答论坛中使用它,效果很好,特别是对于拉丁字母的语言,甚至对于希腊语也看起来不错:
>>> import unidecode
>>> from unidecode import unidecode
>>> unidecode(u'διακριτικός')
'diakritikos'
但是它在处理亚洲语言时就有点奇怪了:
>>> unidecode(u'影師嗎')
'Ying Shi Ma '
>>>
这样说有道理吗?
在askbot中,我们是这样计算网址中的简短标识的:
from unidecode import unidecode
from django.template import defaultfilters
slug = defaultfilters.slugify(unidecode(input_text))