我正在尝试SlugField在Django中创建一个。
我创建了这个简单的模型:
from django.db import models class Test(models.Model): q = models.CharField(max_length=30) s = models.SlugField()
然后,我这样做:
>>> from mysite.books.models import Test >>> t=Test(q="aa a a a", s="b b b b") >>> t.s 'b b b b' >>> t.save() >>> t.s 'b b b b'
我在期待b-b-b-b。
b-b-b-b。
你将需要使用Slugify函数。
>>> from django.template.defaultfilters import slugify >>> slugify("b b b b") u'b-b-b-b' >>>
你可以slugify通过覆盖save方法自动调用:
slugify
save
class Test(models.Model): q = models.CharField(max_length=30) s = models.SlugField() def save(self, *args, **kwargs): self.s = slugify(self.q) super(Test, self).save(*args, **kwargs)
请注意,以上内容将导致你在修改q字段时更改你的URL ,这可能会导致链接断开。创建新对象时最好只生成一次子弹:
class Test(models.Model): q = models.CharField(max_length=30) s = models.SlugField() def save(self, *args, **kwargs): if not self.id: # Newly created object, so set slug self.s = slugify(self.q) super(Test, self).save(*args, **kwargs)
有一些utf-8字符的特殊情况
例:
>>> from django.template.defaultfilters import slugify >>> slugify(u"test ąęśćółń") u'test-aescon' # there is no "l"
这可以用Unidecode解决
>>> from unidecode import unidecode >>> from django.template.defaultfilters import slugify >>> slugify(unidecode(u"test ąęśćółń")) u'test-aescoln'