Diango博客--7.自动生成文章摘要
文章目录
- 0.思路引导
- 1.方法一:覆写 save 方法
- 2.方法二:使用 truncatechars 模板过滤器
0.思路引导
博客文章的模型有一个 excerpt 字段,这个字段用于存储文章的摘要。
若在 django admin 后台手动为文章输入摘要,每次手动输入摘要比较麻烦。
若想要程序自动摘取正文的前 N 个字符作为摘要,以便提供文章预览就可以了。
因此我们来实现如果文章没有输入摘要,则自动摘取正文的前 N 个字符作为摘要。
1.方法一:覆写 save 方法
第一种方法是通过覆写模型的 save()方法,从正文body 中摘取前 N 个字符保存到摘要字段。
save()方法中执行的是保存模型实例数据到数据库的逻辑,因此通过覆写 save() 方法,在保存数据库前做一些事情,比如填充某个缺失字段的值。
方案:先将 body 中的 Markdown 文本转为 HTML 文本,去掉 HTML 文本里的 HTML 标签,然后摘取文本的前 54 个字符作为摘要。去掉 HTML 标签的目的是防止前 54 个字符中存在块级 HTML 标签而使得摘要格式比较难看。可以看到很多网站都采用这样一种生成摘要的方式。
代码位置:blog/models.py
import markdown
from django.utils.html import strip_tagsclass Post(models.Model):# 其它字段...body = models.TextField()excerpt = models.CharField(max_length=200, blank=True)# 其它方法...def save(self, *args, **kwargs):self.modified_time = timezone.now()# 首先实例化一个 Markdown 类,用于渲染 body 的文本。# 由于摘要并不需要生成文章目录,所以去掉了目录拓展。md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',])# 先将 Markdown 文本渲染成 HTML 文本# strip_tags 去掉 HTML 文本的全部 HTML 标签# 从文本摘取前 54 个字符赋给 excerptself.excerpt = strip_tags(md.convert(self.body))[:54]super().save(*args, **kwargs)
然后在模板中适当的地方使用模板标签引用 {{ post.excerpt }} 显示摘要的值即可
文件位置:templates/blog/index.html
<article class="post post-{{ post.pk }}">...<div class="entry-content clearfix"><p>{{ post.excerpt }}</p><div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a></div></div>
</article>
新添加一篇文章(这样才能触发 save 方法,此前添加的文章不会自动生成摘要,要手动保存一下触发 save 方法),可以看到摘要效果如下:
2.方法二:使用 truncatechars 模板过滤器
在 django 的模板系统中,我们之前使用过 safe 过滤器,使用语法为 {{ var | filter: arg }}。可以将模板过滤看做一个函数,它会作用于被它过滤的模板变量,从而改变模板变量的值。
第二种方法是使用 truncatechars 模板过滤器(Filter),其可以截取模板变量值的前 N 个字符显示。
例如摘要效果,需要显示 post.body 的前 54 的字符,那么可以在模板中使用 {{ post.body | truncatechars:54 }}。
文件位置:templates/blog/index.html
<article class="post post-{{ post.pk }}">...<div class="entry-content clearfix"><p>{{ post.body|truncatechars:54 }}</p><div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a></div></div>
</article>
不过这种方法的一个缺点就是如果前 54 个字符含有块级 HTML 元素标签的话(比如一段代码块),会使摘要比较难看。所以推荐使用第一种方法。
Diango博客--7.自动生成文章摘要相关推荐
- CSDN博客如何自动生成文章目录?
文章目录 一.如何添加目录? 二.注意事项 三.输出结果 一.如何添加目录? 在文章开头添加@[TOC] 二.注意事项 "[]"必须在英文状态下输入,TOC需要大写. 标题前添加& ...
- Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
这一节主要做一些修补工作,一个是:文章阅读量的统计,另一个是自动生成文章摘要内容 1 . 文章阅读量的统计: 1 文章阅读量的统计,我们需要在model下的Post类中新加入一个views 字段用来统 ...
- 自动填充html_第 11 篇:自动生成文章摘要
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 [HelloGitHub-Team 仓库](https://github.com/HelloGitHub-Team/Hello ...
- 2017.5.3 博客园自动生成章节目录
参考来自:http://www.cnblogs.com/zzqcn/p/4657124.html 1.效果图 2.申请js权限 写邮件给contact@cnblogs.com. 3.复制代码至页脚ht ...
- 自动生成文章摘要[JavaScript 版本]
实现内容:截断一段含有HTML代码的文本,但是不会出现围堵标记没有封闭的问题. 核心部分如下: function Generate_Brief(text,length){ if(text.lengt ...
- Diango博客--6.Markdown 文章自动生成目录
文章目录 0.思路引导 1.在文中插入目录 2.在页面的任何地方插入目录 3.美化标题的锚点 URL 0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构,本文内容将从以下 ...
- Diango博客--17.统计各个分类和标签下的文章数
文章目录 0.思路引导 1.Model 回顾 2.数据库数据聚合 3.使用 Annotate 4.在模板中引用新增的属性 0.思路引导 在我们的博客侧边栏有分类列表和标签列表,显示博客已有的全部文章分 ...
- Django个人博客搭建8-优化文章模块
Django个人博客搭建1-创建Django项目和第一个App Django个人博客搭建2-编写文章Model模型,View视图 Django个人博客搭建3-创建superuser并向数据库中添加数据 ...
- python博客园_用Python向博客园发布新文章
最近在开发一个博客系统,经常把写的东西放在自己网站的博客上(之前写在Onenote),然后我在博客园也申请了一个博客,就有了同样一篇文章,我需要复制粘贴排版分别提交两次的情况.于是我就想能不能在我的网 ...
最新文章
- Java 获取操作系统名字、系统版本、cpu信息
- U盘也玩NTFS权限。
- xampp打开mysql的admin访问被拒绝_我被我的电脑磁盘拒绝了,为什么打不开,而显示“拒绝访问”呢...
- ThinkPhp框架基础知识
- 图书资料管理课程设计(附源码和连接)
- how does eclipse know what tasks it should do when we select Maven build
- 【MySQL快速入门】高级查询:计算函数分组计算
- 论保留地址与私有地址
- 2020年全国大学生数学建模竞赛辽宁赛区获奖名单(本科组)
- FID指标复现踩坑避坑 文本生成图像FID定量实验全流程复现(Fréchet Inception Distance )定量评价实验踩坑避坑流程
- 逆概率加权Doubly Robust Methods
- RocketMq之一条消息在commitlog文件中如何存储验证
- DiskGenius清除分区空闲空间后硬盘满了
- 认证模式之Digest模式
- OV4689摄像头(MIPI)配置代码
- 赖床星人的枕头arduino
- 企业ERP管理软件有哪些?哪个好
- 名悦集团:汽车冬季保养小知识
- C练题笔记之:Leetcode-393. UTF-8 编码验证
- excel如何筛选一列数据的重复值,并找到其他列的对应数据
热门文章
- 考驾照重点科目的关键考试技巧
- ffmpeg-0.6.3 移植到 windows 开源代码
- guava 之 ImmutableMap 使用实例及好处
- Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
- Junit Test使用样例
- 在线预览word,excel文档
- android node
- OC 中 load 方法和 initialize 方法的异同
- linux_bash_shell_cheat_sheet(自译)
- 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv