这只是从我的一个旧的(如在较好编码)模型中剪切和粘贴。它应该告诉你一个想法,只需要一点点修饰,就可以工作。
from django.template.defaultfilters import slugify
def get_nickname(self):
nick = self.name
vowels = ('a','e','i','o','u')
first_letter = nick[:1]
nick = nick[1:]
for vowel in vowels: nick = nick.replace(vowel,'')
nick = first_letter + nick
if len(nick) > 8:
nick = nick[:7]
return nick
def save(self, force_insert=False, force_update=False, using=None):
if not self.nickname:
self.nickname = self.get_nickname() if len(self.name)>8 else self.name
self.slug = slugify(self.nickname)
slug_test = SomeModel.objects.filter(slug=self.slug, id=self.id) # corrected to use a generic model name
if slug_test:
count = slug_test.count
self.slug = "{}{}".format(self.slug[:len(self.slug)-1], count)
super(SomeModel, self).save()
UPDATE:为get_nick方法更紧凑的代码......
>>> name = 'alabama'
>>> vowels = {'a', 'e', 'i', 'o', 'u'}
>>> nick = name[0] + ''.join(l for l in name[1:] if l not in vowels)
>>> nick
'albm'
FWIW:我刚刚更新了我的模型,消除了get_nickname
方法,并添加一个简单的lambda
到save
方法的顶部:
vowels = {'a','e','i','o','u'}
create_nick = lambda name: name[0] + ''.join(l for l in name[1:] if l not in vowels)[:7]
if not self.nickname:
self.nickname = create_nick(self.name) if len(self.name)>8 else self.name
...
谢谢!我还发现了另一个功能丰富的独特slu app应用程序[django-autoslug](https://bitbucket.org/neithere/django-autoslug) – 2013-03-04 13:51:31
毫无疑问,有一些严重的第三方应用程序在那里!我进行了轻量级的导入'slugify'并添加了'if slug_test'以确保唯一性。我的所有动机都有点愚蠢,所以感谢您的放纵 – Cole 2013-03-04 14:01:16
您的答案绝对是轻量级的,在大多数情况下更好的解决方案 - 感谢您的更新。但为什么你要检查元音和长度?你是否尽量保持网址尽可能短? – 2013-03-04 14:12:27