改变django中的slug使用slugify

时间:2015-03-27 04:04:56

标签: python django

我有代码来创建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

你能帮忙解决这个问题吗?

2 个答案:

答案 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才能使这个东西正常工作。希望我能帮到你。