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 元素标签的话(比如一段代码块),会使摘要比较难看。所以推荐使用第一种方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 增加触摸范围,android seekBar 增加点击和滑动范围

seekBar的的范围有限&#xff0c;有时候设计师要求高度为4dp&#xff0c;此时范围太小&#xff0c;很难滑动成功。因此&#xff0c;我们需要在不改变 UI 的前提下&#xff0c;增加点击和滑动范围。直接上代码&#xff1a;public class MainActivity extends AppCompatActivity …

特斯拉股价暴跌,疯狂烧钱是否真的能够带来高额回报?

“疯狂烧钱”并不能成为公司持续亏损的理由&#xff0c;反而可能成为公司升级转型的关键所在。 上周三&#xff0c;特斯拉发布第四季度财报&#xff0c;其后特斯拉CEO马斯克在电话会议上表示&#xff0c;特斯拉亏损收窄&#xff0c;营收同比增长88%&#xff0c;但与此同时其首…

android gravity参数,Gravity - [ Android中文手册 ] - 在线原生手册 - php中文网

Gravity版本&#xff1a;Android 4.0 r1结构继承关系public class Gravity extends Objectjava.lang.Objectandroid.view.Gravity类概述用来在一个更大容器中布置对象的标准常量和工具。常量public static final intAXIS_CLIP原始位控制右/底边界是否被剪切到它的容器中&#x…

Diango博客--8.解锁博客侧栏

文章目录0.思路引导1.[最新文章] 模板标签2.[归档] 模板标签3.[分类] 模板标签4.[标签云] 模板标签5.使用自定义的模板标签0.思路引导 博客侧边栏有四项内容&#xff1a;最新文章、归档、分类和标签云&#xff0c;效果展示如下&#xff1a; 这些内容相对比较固定和独立&…

十五、详述 IntelliJ IDEA 插件的安装及使用方法

正文 首先&#xff0c;进入插件安装界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.标注 1&#xff1a;显示 IntelliJ IDEA 的插件分类&#xff0c; All plugins&#xff1a;显示 Inte…

编程巨星的唯一秘诀

别以为是那些软件开发定律&#xff0c;别以为是开发出那些特殊用途的软件&#xff0c;别以为是软件设计技术本身。只有一条真理决定了一个软件程序员的成功还是失败。由于坚持这个真理&#xff0c;一个资深的程序员能在一天的时间里学会一门新的编程语言&#xff0c;而由于不坚…

面向数据流的设计方法

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。 在软件工程的需求分析阶段&#xff0c;信息流是一个关键考虑。通常用数据流图描绘信息在系统中加工和流动的 情况。面向数据流的设计方法定义了一些不同的“映射”&#xff0c;利用这些映射可以把数据流图…

AI研究的盲点:无解的神经网络内在逻辑

论人工神经网络内在逻辑的研究历史及现状。 伴随着大数据&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎来了新的高潮。在这场涉及大部分科学的革命中&#xff0c;人工神经网络释放了人工智能&#xff08;AI&#xff09;。但科学家们发现&a…

Diango博客--9.归档、分类和标签页

文章目录0.思路引导1.回顾2.归档页面3.分类页面4.标签页面0.思路引导 侧边栏已经正确地显示了最新文章列表、归档、分类、标签等信息&#xff0c;现在来完善归档、分类和标签功能。 当用户点击归档下的某个日期、分类栏目下的某个分类或者标签栏目下的某个标签时&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio开发Android APP | 菜鸟教程

写在前面本节将介绍如何使用Android Studio开发Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android开发环境一样&#xff0c;本节也只是介绍一些基本东西&#xff0c;深入的&#xff0c;比如快捷键&#xff0c;小技巧等会再另一篇文章中详细地介绍&#xff01;1.下载A…

软件工程中的启发规则

1.改进软件结构提高模块独立性 2. 模块规模应该适中 3.深度、宽度、扇出和扇入都应适当 4.模块的作用域应该在控制域之内 5.力争降低模块接口的复杂程度 6.设计单入口单出口的模块 7.模块功能应该可以预测

C#指南,重温基础,展望远方!(4)表达式

表达式是在操作数和运算符的基础之上构造而成。 表达式的运算符指明了向操作数应用的运算。 运算符的示例包括 、-、*、/ 和 new。 操作数的示例包括文本、字段、局部变量和表达式。 如果表达式包含多个运算符&#xff0c;那么运算符的优先级决定了各个运算符的计算顺序。 例如…

UPS开始尝试“货车+无人机”的投递方式,不必再担心快递员离职了

继亚马逊“空中仓库”&#xff0c;无人机送货再现新形式。 作为世界上最大的快递承运商与包裹递送公司&#xff0c;UPS当然也没有放过“送货无人机”这一新颖业务。与亚马逊推出“空中仓库”的理念类似&#xff0c;UPS并没有选择让无人机从仓库直接起飞&#xff0c;而是将之与…

技术人员如何"正确"的浪费时间?

苹果产品用户要浪费时间&#xff0c;你就应该这样做&#xff1a;买个有锁的 iPhone &#xff0c;每天刷几百次威锋网等待越狱或解锁&#xff0c;看到新 App 就安装&#xff0c;程序提示更新立刻升级&#xff1b;有新的固件(哪怕是 β 版)就压制不住升级的欲望&#xff1b;每次 …

Diango博客--10.交流的桥梁“评论功能”

文章目录0.思路引导1.创建"评论"应用2.设计"评论"的数据库模型3.注册"评论"模型到 admin4.设计“评论”表单5.展示评论表单6.“评论”视图函数7.绑定 URL8.向读者发送是否“评论”成功的状态9.详情页底部显示“评论”内容0.思路引导 本文将创建…

python与android交互,Android客户端与Python服务器端的简单通信

最近在做一个APP&#xff0c;需要与服务器通信&#xff0c;一点一点的尝试&#xff0c;记录一下。本文使用了OkHttp和Flask框架。Android客户端&#xff1a;实现功能输入完点击OK按钮后会toast成功的信息。Python服务端&#xff1a;各部分代码如下&#xff1a;activity_main.xm…

结构程序设计

结构程序设计经典定义&#xff1a;如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接&#xff0c;并且每个代码块只有一个入口和一个出口&#xff0c;则称这个程序是结构化的。 结构程序设计更全面的定义&#xff1a;结构程序设计是尽可能少用GO TO语句…

Sql Server 开窗函数Over()的使用

利用over()&#xff0c;将统计信息计算出来&#xff0c;然后直接筛选结果集1 declare t table(2 ProductID int,3 ProductName varchar(20),4 ProductType varchar(20),5 Price int)6 7 insert t8 select 1,name1,P1,3 union all9 select 2,name2,P1,5 union all 10 select 3,…

云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%

1、数字经济版图呈中美双分趋势 日本IT行业为前景担忧 数字经济版图呈中美双分趋势 日本IT行业为前景担忧 【新闻摘要】《日本经济新闻》日前刊文称&#xff0c;数字经济的势力版图呈现中国和美国两强双分的趋势明显&#xff0c;这意味着日本可能不得不使用中美的技术&#xff…