Django - 生成默认 slug

Posted

技术标签:

【中文标题】Django - 生成默认 slug【英文标题】:Django - Generate default slug 【发布时间】:2011-06-20 13:16:26 【问题描述】:

我想为我的模型生成一个随机 slug,但没有设置“blank=True”(因为我想稍后通过验证来强制执行它。)

我想知道我是否可以这样做:

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug')

其中 some_method 是一种生成随机 slug 的方法?我已经尝试了上面的代码,但它不起作用:(

我想做的是生成一个独特的 slug (unique_slugify?)

【问题讨论】:

这个在创建对象的时候调用方法,是不是故意的? 是的,虽然它不起作用... NameError: name 'some_method' is not defined 【参考方案1】:

当您希望自动生成 slug 时,可以使用此选项,并在同一模型中的其他字段中输入条目,即 slug 所在的位置。

from django_extensions.db.fields import AutoSlugField

slug = AutoSlugField(_('slug'), max_length=50, unique=True, populate_from=('name',))
populate_from 是模型中将自动生成 slug 的字段

【讨论】:

对于那些不知道的人,django_extensions 模块似乎来自同名库:packages.python.org/django-extensions/#【参考方案2】:

您可以覆盖模型保存方法,以便在创建新实体时即时生成 slug。比如:

if not self.pk:
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10))

可以这样做,但这不是很好,最好让 slug 成为对象名称的确定性 slugified 版本。

【讨论】:

我不介意如果是这种情况,我只是对如何将其设置为默认设置感到困惑。我没有使用管理面板 随机字符串不利于唯一性,最好坚持使用摘要之类的东西(时间戳结合随机) 谢谢。我不想覆盖保存方法,但它似乎是不可避免的。 Tommaso,如果你有一个例子来说明你的意思,我会很感激。【参考方案3】:

default 必须是值或可调用对象。 所以它是default=some_method,而不是default=some_method()。这是一个例子:

from django.contrib.auth.models import UserManager

def randomString():
    um = UserManager()
    return( um.make_random_password( length=25 ) )

class Foo( models.Model ):
    code = models.CharField( max_length=25, default=randomString )

【讨论】:

有趣,使用 random.random 不起作用我收到了 Cannot serialize function 错误,但这个自定义函数确实发生了。 感谢您提出这个问题!它帮助了我!【参考方案4】:

也许模型验证可以提供帮助? http://docs.djangoproject.com/en/dev/ref/models/instances/

您可以简单地验证应该写入 slug 字段中的值,如果它已经存在,则生成一些独特的东西。

也可以覆盖模型保存方法。

干杯。

【讨论】:

【参考方案5】:

在谷歌搜索,我发现了类似的问题:How to use slug in django

我认为更好的方法是重写保存方法,并验证表单中的字段。

但是,slug 应该是唯一的,所以生成随机字符串不好!就像 Tommaso Bardugi 早说的那样,如果你在 url 中添加时间戳,这个问题就解决了。

【讨论】:

以上是关于Django - 生成默认 slug的主要内容,如果未能解决你的问题,请参考以下文章

Django:为数据库中的现有条目生成 slug 字段数据

使用 Django 生成的 slug URL 链接到特定页面

Django

如何在 django 2.0.4 中从我的专辑模型自动生成 slug

django相关字段解释(slug)

url django 中呈现的 slug 不正确