我想为我的模型生成一个随机slug,但没有设置“blank = True”(因为我想稍后通过验证强制执行。)
我想知道我是否可以做这样的事情:
slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug')
some_method是一种生成随机slug的方法?我已经尝试了上面的代码,它不起作用:(
我想做的是生成一个独特的slug(unique_slugify?)
答案 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中添加时间戳,这就解决了。