使用ID创建Slug字段

时间:2017-09-08 14:08:37

标签: django django-models

这是postmodel并尝试创建一个slug唯一字段 Slug字段创建错误str(self.id)正在返回" none" seld.title工作正常的地方

class postmodel(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(User,default=None)
    body = models.TextField()
    slug = models.SlugField(unique=True)
    subject=models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True,auto_now=False)
    updated = models.DateTimeField(auto_now=True,auto_now_add=False)

    @models.permalink
    def get_absolute_url(self):
        return ('blog_post_dpetail', (),
                {
                    'slug': self.slug,
                })

    def save(self, *args, **kwargs):
        if not self.slug:

            self.slug = slugify(self.title)+"-"+str(self.id)
        super(postmodel, self).save(*args, **kwargs)

3 个答案:

答案 0 :(得分:0)

self.id是数据库中的自动增量字段,只有在数据库中保存对象后才存在,所以你创建了一个僵局:

如果slug为none,则可以保存对象,并且可以在不保存对象时创建slug。

希望对你有所帮助。

答案 1 :(得分:0)

在数据库中保存对象之前,您无法获得self.id。因此,您可以将save()方法修改为:

def save(self, *args, **kwargs):
    super(postmodel, self).save(*args, **kwargs)  # Save your model in order to get the id

    # Then implement the logic for the slug

    if not self.slug:
        self.slug = slugify(self.title) + "-" + str(self.id)
        self.save()  # Call save() again in order to save the slug

答案 2 :(得分:0)

因此我根据先前的答案提出了一个足够好的解决方案。

在models.py

这允许您在首次提交表单时slugfield为空白...

slug = models.SlugField(unique=True, allow_unicode=True, blank=True)

将保存功能重写为1.创建帖子2.将帖子实例的子弹设置为标题+帖子ID。

def save(self, *args, **kwargs):
    super(Post, self).save(*args, **kwargs)
    self.slug = slugify(self.title) + "-" + str(self.id)
    return super(Post, self).save(*args, **kwargs)

希望有帮助。