在一些模型的字段设置上(比如文章),我们可能需要添加一个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了。
以上。
网友评论