当我第一次从管理界面保存模型时,我需要自动生成slug。我使用slugify
和pre_save signal
,我的slug字段有unique=True
选项。但是当我按下保存按钮时,对象slugfield raise validation error (Required field)
因为字段是唯一的,我认为。我认为pre_save在验证之前进行。或者我错了?
# models.py
class Slugified(models.Model):
slug = models.CharField(unique=True, max_length=50)
class Meta:
abstract = True
class Post(Slugified):
title = models.Charfield(max_length=50)
@receiver(pre_save, sender=Post)
def save_slug(sender, instance, *args, **kwargs):
instance.slug = slugify(instance.title)
答案 0 :(得分:2)
管理员自动生成的表单会将slug
字段视为必填字段。 pre_save
信号接收器工作正常,但代码从不尝试保存模型,因为表单没有验证。
对此的解决方案是所有空白值:
class Slugified(models.Model):
slug = models.CharField(unique=True, max_length=50, blank=True)
这样,表单中不需要该字段,并且在保存实例之前设置了slug。
此外,请注意您的代码无法正确处理重复的slu ..如果两个帖子标题生成相同的slug,则会引发IntegrityError
。这在save
方法中比在pre_save
信号接收器中更容易解决:
class Slugified(models.Model):
slug = models.CharField(unique=True, max_length=50, blank=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
while True:
try:
return super(Slugified, self).save(*args, **kwargs)
except IntegrityError:
# generate a new slug