Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最佳实践:在Django中预填充SlugField(不带管理模块)_Python_Django_Slug - Fatal编程技术网

Python 最佳实践:在Django中预填充SlugField(不带管理模块)

Python 最佳实践:在Django中预填充SlugField(不带管理模块),python,django,slug,Python,Django,Slug,在Django早期,可以在模型中预填充SlugField 在管理模块中,我将使用 prepopulated_fields = {'slug':('title',),} 我找到了一个处理它的片段,但我怀疑这是最好的方法 那么,在不使用管理模块的情况下自动生成SlugField的最佳实践是什么 我想使用ModelForm在frontpage中集成表单,它会自动为URL生成一个唯一的slug。这只是从我的一个较旧的(如编码不太好的)模型中剪切和粘贴的。它应该向你展示一个想法,只要稍加润色,就会奏效

在Django早期,可以在模型中预填充SlugField

在管理模块中,我将使用

prepopulated_fields = {'slug':('title',),}
我找到了一个处理它的片段,但我怀疑这是最好的方法

那么,在不使用管理模块的情况下自动生成SlugField的最佳实践是什么


我想使用ModelForm在frontpage中集成表单,它会自动为URL生成一个唯一的slug。

这只是从我的一个较旧的(如编码不太好的)模型中剪切和粘贴的。它应该向你展示一个想法,只要稍加润色,就会奏效

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()
更新: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_昵称
方法,并在
save
方法的顶部添加了一个简单的
lambda

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
...

非常感谢。我还发现了另一款功能丰富的独特Slug应用,毫无疑问,还有一些第三方应用!我选择了轻量级,导入了
slagify
,并添加了
if-slug\u测试
,以确保唯一性。我所有的措辞都有点傻,所以谢谢你的宽容。你的答案绝对是轻量级的,而且在大多数情况下是更好的解决方案——谢谢你的精彩更新。但是为什么要检查元音和长度呢?你试着让URL尽可能短吗?某人的URL有3或4个slug字段,并且在URL的末尾有一个数字标识。我想让它不需要太长就可以扫描。例如,iPhone在url中只能显示这么多字母。