Django - 生成默认slug

Han*_*pan 9 django django-models

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

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

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug')
Run Code Online (Sandbox Code Playgroud)

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

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

Pra*_*eek 22

如果希望使用同一模型中其他字段中的条目(slug所在的位置)创建条目,则可以使用此方法.

from django_extensions.db.fields import AutoSlugField

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

  • 对于那些不知道的人来说,似乎django_extensions模块来自同名的库:http://packages.python.org/django-extensions/# (5认同)

Bjö*_*ist 9

您可以覆盖模型save-method,以便在创建新实体时即时生成slug.就像是:

if not self.pk:
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10))
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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 )
Run Code Online (Sandbox Code Playgroud)