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

2024-06-17 14:55:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在管理模块中,我会使用

prepopulated_fields = {'slug':('title',),}

我找到了一个代码片段来处理它Unique Slugify,但我怀疑这是最好的方法。在

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

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


Tags: 模块django方法代码模型fieldstitleunique
1条回答
网友
1楼 · 发布于 2024-06-17 14:55:53

这只是从我的一个旧模型(如代码不太好)中剪切粘贴的。它应该告诉你一个想法,只要稍加润色就可以了。在

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()

更新nick代码。。。在

^{pr2}$

FWIW:我刚刚更新了我的模型,去掉了get_nickname方法,并在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
...

相关问题 更多 >