Django:在保存模型之前生成slug

时间:2014-06-29 12:00:38

标签: django models

当我第一次从管理界面保存模型时,我需要自动生成slug。我使用slugifypre_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)

1 个答案:

答案 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