如何在Django中自动创建utf8 slug?

时间:2014-02-01 17:44:36

标签: django utf-8 slug

我希望Django能够为这个模型自动创建slug:

class News(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    teaser = models.TextField('teaser', blank=True)
    created=models.DateTimeField(auto_now_add=True)
    pub_date=models.DateTimeField(default=datetime.datetime.now)
    categories = models.ManyToManyField(Category, blank=True)
    likes = models.IntegerField(default=0)
    visits = models.IntegerField(default=0)
    slug = models.CharField(max_length=100, unique=True) 

    def __unicode__(self):
        return unicode(self.title)

    def save(self, *args, **kwargs):
        self.title = slugify_unicode(self.title)
        super(News, self).save(*args, **kwargs)

我使用CharField而不是slugfield,因为Slug fields can only contain ASCII letters, numbers, dashses and underlines但是我想根据波斯标题创建slug。

我的views.py有此功能来创建新闻项目:

@staff_member_required
def add_news(request):
    if request.method == 'POST':
        form = NewsForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/all_news')

    if request.method == 'GET':
        form = NewsForm()
        args = {}
        args.update(csrf(request))
        args['form'] = form
        return render_to_response('news/add_news.html', args)  

当我手动创建Persian slugs时这很好用,但这真的很麻烦。所以我想知道是否有办法让Django在保存时根据标题创建slu ..

所以例如,标题是:

'یک خبر مهم'

我想自动创建'یک-خبر-مهم'作为slu ..

3 个答案:

答案 0 :(得分:2)

django 1.9版中引入的新选项是SlugField.allow_unicode

如果为True,除ASCII字母外,该字段还接受Unicode字母。默认为False。 doc

例如:

在models.py文件中,定义slug列,如下所示:

slug = models.SlugField(allow_unicode=True)

答案 1 :(得分:1)

Slugs需要是ASCI,因此可以安全地在URL中使用。

请查看django-autoslug

它会尝试为你翻译标题。

>>> import unidecode
>>> unidecode.unidecode(u'و')
'w'
>>> unidecode.unidecode(u'風')
'Feng '

答案 2 :(得分:0)

简单地替换

self.title = slugify_unicode(self.title)
保存(自我......新闻方法

    self.slug = slugify_unicode(self.title)

解决了这个问题。