作者:HelloGitHub-追梦人文章中涉及的示例代码已更新至HelloGitHub-Team仓库。博文的模型有一个摘录字段,用来存储文章的摘要。目前为止只能在djangoadmin后台手动输入文章摘要。每次都手动输入摘要很麻烦。对于某些文章,提取正文的前N个字符作为摘要就足以提供文章的预览。那么我们来实现一下,如果文章没有输入摘要,那么会自动提取正文的前N个字符作为摘要。有两种方法可以实现这一点。覆盖保存方法第一种方法是通过覆盖模型的保存方法,将文本字段的前N??个字符保存到摘要字段。在创作后台打开,请开始你的表演。我们提到save方法执行的是将模型实例数据保存到数据库的逻辑,所以通过重写save方法,在保存数据库之前做一些事情,比如填充一个缺失的字段的值。查看博文模型代码:blog/models.pyclassPost(models.Model):#Otherfields...body=models.TextField()excerpt=models.CharField(max_length=200,blank=True)defsave(self,*args,**kwargs):self.modified_time=timezone.now()super().save(*args,**kwargs)其中body字段存储文本,excerpt字段用于存储摘要。通过重写模型的save方法,在数据保存到数据库之前,从body字段中提取出N个字符保存在excerpt字段中,从而达到自动摘要的目的。具体代码如下:blog/models.pyimportmarkdownfromdjango.utils.htmlimportstrip_tagsclassPost(models.Model):#Otherfields...body=models.TextField()excerpt=models.CharField(max_length=200,blank=True)#Othermethods...defsave(self,*args,**kwargs):self.modified_time=timezone.now()#首先实例化一个Markdown类来渲染正文。#由于摘要不需要生成文章目录,所以去掉了目录扩展名。md=markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',])#首先将Markdown文本渲染成HTML文本#strip_tags从HTML文本中移除所有HTML标签#提取自text前54个字符赋值给excerptself.excerpt=strip_tags(md.convert(self.body))[:54]super().save(*args,**kwargs)这里生成摘要的解决方法是首先将Markdown文本转换为HTML文本,去除HTML文本中的HTML标签,然后提取文本的前54个字符作为摘要。剥离HTML标签的目的是防止在前54个字符中出现块级HTML标签,这会使抽象格式难看。可以看到很多网站都采用了这种生成摘要的方式。然后在模板中适当的地方使用模板标签引用{{post.excerpt}}来显示摘要的值:templates/blog/index.html {{帖子。摘录}}...
