python - 最佳实践 : prepopulate SlugField in Django (without Admin module)

标签 python django slug

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

在管理模块中我会使用

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

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

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

我想使用 ModelForm 将表单集成到首页中,这应该会自动为 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_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
...

关于python - 最佳实践 : prepopulate SlugField in Django (without Admin module),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202455/

相关文章:

python - 是否可以检查自定义上下文处理器定义中的 View 中是否已设置上下文变量?

python - 检查文件中的重复项两次 - Python

python - Django 最佳实践 - 何时使用 View 、何时使用标签

python - Mac 上的 MySQL 和 Django - 未加载 libssl.1.0.0.dylib

django - 两个带有外键引用的表相互引用

PHP 函数来制作 slug(URL 字符串)

php - 在 Laravel 中使用阿拉伯字符作为 Slug

ember.js - 使用 Ember.js 生成 Slug url

python - 如何在 django 模板中显示日期时间的本地化时间

python - 在多词字符串列表中,提取第二个词