[править]
Я забираю это обратно, django.template.defaultfilters.slugify()
Джанго делает то, что вы хотите, используя unicodedata.normalize
и .encode('ascii', 'ignore')
. Просто подайте вашу строку в slugify:
from django.template.defaultfilters import slugify
print slugify(u"những-viên-kẹo")
Чтобы сделать это автоматически, добавьте это к методу .save()
в ваших моделях:
from django.template.defaultfilters import slugify
MyModel(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(blank=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(MyModel, self).save(*args, **kwargs)
Раствор, который я написал раньше (ниже), все еще будет полезен для языков, которые требуют дополнительных символов в своем переводе, например, немецкий язык ü-> ue, ß-> ss и т. Д.
[оригинальный пост]
Python позволяет использовать перевод для перевода символов в замещающую строку.
Простая версия для вашего случая будет:
vietnamese_map = {
ord(u'ư'): 'u',
ord(u'ơ'): 'o',
ord(u'á'): 'a',
ord(u'n'): 'n',
ord(u'h'): 'h',
ord(u'ữ'): 'u',
ord(u'n'): 'n',
ord(u'g'): 'g',
ord(u'v'): 'v',
ord(u'i'): 'i',
ord(u'ê'): 'e',
ord(u'n'): 'n',
ord(u'k'): 'k',
ord(u'ẹ'): 'e',
ord(u'o'): 'o',
}
И тогда вы можете позвонить:
print u"những-viên-kẹo".translate(vietnamese_map)
Чтобы получить:
u"nhung-vien-keo"
Для более продвинутого использования (например, динамический дикт), смотрите, например, http://effbot.org/zone/unicode-convert.htm
Обратите внимание, что вышесказанное просто показывает, как должна выглядеть карта, это не очень удобный способ ввода данных. Более удобный способ сделать то же самое - что-то вроде:
_map = u"nn hh ữu nn gg vv ii êe nn kk ẹe oo"
# Take the above string and generate a translation dict
vietnamese_map = dict((ord(m[0]), m[1:]) for m in _map.split())
print u"những-viên-kẹo".translate(vietnamese_map)