django slugify - 为德国变形金刚定制

时间:2013-11-26 20:42:19

标签: python django

我在这个问题上有点困惑:

众所周知,django有一个slugify模板标记,可以traume-von-bucher生成Träume von Bücher

但从语法上讲,Träume应该成为Traeume,这将是正确的德语单词。

如何编写自己的自定义标记,以便将Ä标记为Ae

2 个答案:

答案 0 :(得分:4)

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.text import slugify

register = template.Library()

@register.filter
@stringfilter
def germanslugify(value):
    replacements = [(u'ä', u'ae')]
    for (s, r) in replacements:
            value = value.replace(s, r)
    return slugify(value)

答案 1 :(得分:1)

只是为了添加beerbajay的答案。

我想更改整个应用程序的默认slugify (默认实现删除了挪威字符'ø'和'æ') 无需为了修改slugify调用而对所有内容进行fork / subclass。

所以我决定将其打包。只要自定义slugify像beerbajay一样实施,它应该是安全的。 例如,做一些简单的替换并调用原始的slugify; 所以它的输出不会打破任何关于它的假设。

这是我如何做到的(在Django 1.7中测试过,但它也可能适用于旧版本)

我创建了一个应用程序来包含monkeypatching代码,在此示例中称为monkeys。 首先在已安装的应用中添加它,以便它在所有其他应用之前运行:

INSTALLED_APPS = (
    'monkeys', # The monkey patches app
    #... all the other apps below here

monkeys/__init__.py文件中添加以下代码:

import django.template.defaultfilters
from where.you.defined.it import custom_slugify
#print "MONKEY PATCHING NOW!" 
#Uncomment the above to verify that this code actually called
django.template.defaultfilters.slugify = custom_slugify

只要所有应用程序都使用django.template.defaultfilters.slugify制作slug,这应该可行。