Django - 生成默认slug

时间:2011-02-03 09:53:54

标签: django django-models

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

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

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

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

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

5 个答案:

答案 0 :(得分:22)

如果希望使用同一模型中其他字段中的条目进行自动生成slug,则可以使用此方法。

from django_extensions.db.fields import AutoSlugField

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

答案 1 :(得分:8)

您可以覆盖模型save-method,以便在创建新实体时动态生成slug。类似的东西:

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

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

答案 2 :(得分: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 )

答案 3 :(得分:1)

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

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

同样重写模型保存方法可能是解决方案。

干杯。

答案 4 :(得分:1)

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

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

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