美文网首页
Django 为slug字段添加中文化支持

Django 为slug字段添加中文化支持

作者: 红煌流星 | 来源:发表于2019-01-12 23:21 被阅读0次

    在一些模型的字段设置上(比如文章),我们可能需要添加一个slug字段,这个字段对SEO友好。
    models.py

    class Articles(model.Models):
        title = models.CharField(max_length=100)
        slug = models.SlugField(max_length=250)
    

    在设置管理界面的时候,我们可以用到一个预生成属性,让Django来根据某些字段来自动生成slug:
    admin.py

    @admin.register(Articles)
    class ArticlesAdmin(admin.ModelAdmin):
        prepopulated_fields = {"slug": ("title", )}
    

    注意这个prepopulated_fields属性是不能选择自动生成,预生成的字段的,比如pub_date(auto_now=True)
    这样我们在后台写入文章的标题的时候,就会根据title字段自动生成slug字段的值。可是这个功能只是支持英语的,输入中文是没有反应的。
    有没有办法自动生成中文标题的slug呢?
    在这里我们需要用到一个支持中文slug的库,awesome-slugify。先通过pipenv安装:
    pipenv install awesome-slugify
    在我们新建一个文章Articles的实例的时候,在后台管理系统里最后保存的时候用的是SAVE,在命令行新建的时候,也是类似:

    article1 = Article(title="chinhung", slug="chinhung")
    article1.save()
    

    create方法可以一步到位,我们这里先不讨论。
    可见在新建一个文章的时候,我们都是需要调用save()方法的,所以我们这里需要重写Articles的save()方法。
    models.py

    from slugify import slugify
    
    
    class Articles(model.Models):
        title = models.CharField(max_length=100)
        slug = models.SlugField(max_length=250)
        
        def save(self, *args, **kwargs):
            self.slug = slugify(self.title)
            super().save(*args, **kwargs)
    

    这样我们就完成了save方法的重写,在保存的时候它会根据title的值来生成slug的值。
    我们来后台界面试试。

    ...
    图略,linux截图太麻烦
    一番操作,我们给slug的值留空,保存的时候,发现这个值是必填项,要自己填一个进去,这就和我们的初衷不一样了。Django会验证slug这个值是否为空,我们给slug加一个属性,就可以去掉Django的验证:
    models.py

    slug = models.SlugField(max_length=250, blank=True)
    

    blank=True允许设定字段为空白值,这样就不会数据验证了。注意不是null=True,这个属性允许在数据库为空值,我们只需去掉Django后台的验证就行了。
    这样就可以自动生成中文对应的slug了。
    以上。

    相关文章

      网友评论

          本文标题:Django 为slug字段添加中文化支持

          本文链接:https://www.haomeiwen.com/subject/yojhdqtx.html