当前位置: 首页 > 后端技术 > Python

HelloDjangoPart11-自动生成文章摘要

时间:2023-03-26 19:02:16 Python

作者: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。..

{{帖子。摘录}}...

继续阅读
NEW添加文章(这样可以触发保存方法,之前添加的文章不会自动生成摘要,需要手动保存触发save方法),即可看到摘要效果。使用truncatechars模板过滤器第二种方法是使用truncatechars模板过滤器(Filter)。在django的模板系统中,使用模板过滤器的语法是{{var|过滤器:参数}}。你可以把模板过滤想象成一个函数,它作用于它过滤的模板变量,从而改变模板变量的值。比如这里的truncatechars过滤器可以截取模板变量值的前N个字符进行显示。关于模板过滤器,我们之前使用过safe过滤器,本文关于模板过滤器的描述可以参考让博客支持Markdown语法和代码高亮。比如摘要效果需要显示post.body的前54个字符,那么可以使用{{post.body|truncatechars:54}}在模板中。templates/blog/index.html...

{{post.body|truncatechars:54}}

继续阅读
但是,这种方法的一个缺点是如果前54个字符包含块级HTML元素标记(例如代码块),这使得摘要变得丑陋。所以推荐使用第一种方法。欢迎关注HelloGitHub公众号获取更多开源项目的资讯和内容。《解释开源项目系列》上线——让对开源项目感兴趣的人不再害怕,让开源项目的发起者不再孤单。关注我们的文章,您将发现编程的乐趣,使用并发现参与开源项目是多么容易。欢迎联系我们投稿,让更多的人爱上开源,为开源做贡献~