文章目录

  • 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.自动生成文章摘要相关推荐

  1. CSDN博客如何自动生成文章目录?

    文章目录 一.如何添加目录? 二.注意事项 三.输出结果 一.如何添加目录? 在文章开头添加@[TOC] 二.注意事项 "[]"必须在英文状态下输入,TOC需要大写. 标题前添加& ...

  2. Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)

    这一节主要做一些修补工作,一个是:文章阅读量的统计,另一个是自动生成文章摘要内容 1 . 文章阅读量的统计: 1 文章阅读量的统计,我们需要在model下的Post类中新加入一个views 字段用来统 ...

  3. 自动填充html_第 11 篇:自动生成文章摘要

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 [HelloGitHub-Team 仓库](https://github.com/HelloGitHub-Team/Hello ...

  4. 2017.5.3 博客园自动生成章节目录

    参考来自:http://www.cnblogs.com/zzqcn/p/4657124.html 1.效果图 2.申请js权限 写邮件给contact@cnblogs.com. 3.复制代码至页脚ht ...

  5. 自动生成文章摘要[JavaScript 版本]

    实现内容:截断一段含有HTML代码的文本,但是不会出现围堵标记没有封闭的问题. 核心部分如下: function Generate_Brief(text,length){  if(text.lengt ...

  6. Diango博客--6.Markdown 文章自动生成目录

    文章目录 0.思路引导 1.在文中插入目录 2.在页面的任何地方插入目录 3.美化标题的锚点 URL 0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构,本文内容将从以下 ...

  7. Diango博客--17.统计各个分类和标签下的文章数

    文章目录 0.思路引导 1.Model 回顾 2.数据库数据聚合 3.使用 Annotate 4.在模板中引用新增的属性 0.思路引导 在我们的博客侧边栏有分类列表和标签列表,显示博客已有的全部文章分 ...

  8. Django个人博客搭建8-优化文章模块

    Django个人博客搭建1-创建Django项目和第一个App Django个人博客搭建2-编写文章Model模型,View视图 Django个人博客搭建3-创建superuser并向数据库中添加数据 ...

  9. python博客园_用Python向博客园发布新文章

    最近在开发一个博客系统,经常把写的东西放在自己网站的博客上(之前写在Onenote),然后我在博客园也申请了一个博客,就有了同样一篇文章,我需要复制粘贴排版分别提交两次的情况.于是我就想能不能在我的网 ...

最新文章

  1. Java 获取操作系统名字、系统版本、cpu信息
  2. U盘也玩NTFS权限。
  3. xampp打开mysql的admin访问被拒绝_我被我的电脑磁盘拒绝了,为什么打不开,而显示“拒绝访问”呢...
  4. ThinkPhp框架基础知识
  5. 图书资料管理课程设计(附源码和连接)
  6. how does eclipse know what tasks it should do when we select Maven build
  7. 【MySQL快速入门】高级查询:计算函数分组计算
  8. 论保留地址与私有地址
  9. 2020年全国大学生数学建模竞赛辽宁赛区获奖名单(本科组)
  10. FID指标复现踩坑避坑 文本生成图像FID定量实验全流程复现(Fréchet Inception Distance )定量评价实验踩坑避坑流程
  11. 逆概率加权Doubly Robust Methods
  12. RocketMq之一条消息在commitlog文件中如何存储验证
  13. DiskGenius清除分区空闲空间后硬盘满了
  14. 认证模式之Digest模式
  15. OV4689摄像头(MIPI)配置代码
  16. 赖床星人的枕头arduino
  17. 企业ERP管理软件有哪些?哪个好
  18. 名悦集团:汽车冬季保养小知识
  19. C练题笔记之:Leetcode-393. UTF-8 编码验证
  20. excel如何筛选一列数据的重复值,并找到其他列的对应数据

热门文章

  1. 考驾照重点科目的关键考试技巧
  2. ffmpeg-0.6.3 移植到 windows 开源代码
  3. guava 之 ImmutableMap 使用实例及好处
  4. Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
  5. Junit Test使用样例
  6. 在线预览word,excel文档
  7. android node
  8. OC 中 load 方法和 initialize 方法的异同
  9. linux_bash_shell_cheat_sheet(自译)
  10. 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv