我有代码来创建slug自动使用slugify
。但是当我编辑标题时,slug不会生成新标题。
这是代码model.py
class Tag(models.Model):
title = models.CharField(max_length=50)
slug = models.CharField(max_length=200, null=True, blank=True)
description = models.TextField()
created_date = models.DateTimeField(auto_now_add=True)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def save(self):
if not self.slug:
self.slug = slugify(self.title)
return super(Tag, self).save()
def __str__(self):
return self.title
你能帮忙解决这个问题吗?
答案 0 :(得分:4)
在您当前的代码中,只有当先前不存在slug时才会进行slugify。只有当您第一次保存,或者标题不存在或者slug为空时,才会出现这种情况。
相反,你需要在每次更换slug时保存它(这又取决于标题)。
因此,请将您的保存方法更改为:
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
return super(Tag, self).save(*args, **kwargs))
更新说明:经过一些测试后,事实证明最好简单地传递args和kwargs,因为你无法知道你需要处理哪些参数。基于this answer。
答案 1 :(得分:0)
我自己学习的最简单方法: - 在你的Django应用程序模型中,你必须做下一个
from django.template.defaultfilters import slugify
class MyClass(models.Model):
title = models.CharField(max_length=40, null=False)
slug = models.SlugField(default=slugify(title), unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(MyClass, self).save(*args, **kwargs)
这就是全部,默认情况下,你的slug行将包含标题中检测到的最后一个字符串,所以你必须使标题不为null才能使这个东西正常工作。希望我能帮到你。