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 URL 链接到特定页面