这是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)
答案 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)
因此我根据先前的答案提出了一个足够好的解决方案。
这允许您在首次提交表单时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)
希望有帮助。