Django 博客文章自动生成摘要的两种方法

首页的博客文章列表通常需要显示摘要,Django 有两种方法来实现这个需求。

复写 save 方法

第一种方法是通过复写模型的 save 方法,从正文字段摘取前 N 个字符保存到摘要字段。假设我们的博客文章模型为:

class Post(models.Model):
    # 其它字段...
    body = models.TextField()
    excerpt = models.CharField(max_length=200, blank=True)

其中 body 字段存储的是正文,excerpt 字段用于存储摘要。通过复写模型的 save 方法,在数据被保存到数据库前,先从 body 字段摘取 N 个字符保存到 excerpt 字段中,从而实现自动摘要的目的。具体代码如下:

class Post(models.Model):
    # 其它字段...
    body = models.TextField()
    excerpt = models.CharField(max_length=200, blank=True)

    # 其它方法...

    def save(self, *args, **kwargs):
        # 从 body 摘取前 54 个字符赋给到 excerpt
        self.excerpt = self.body[:54]
        # 调用父类的 save 方法将数据保存到数据库中
        super(Post, self).save(*args, **kwargs)

然后在模板中适当的地方使用模板标签引用 {{ post.excerpt }} 显示摘要的值即可。

使用 truncatechars 模板过滤器

第二种方法是使用 truncatechars 模板过滤器。在 Django 的模板系统中,模板变量器的使用语法为 {{ var | filter: arg }}。可以将模板过滤看做一个函数,它会作用于被它作用的模板变量,从而改变模板变量的值。例如这里的 truncatechars 过滤器可以截取模板变量值的前 N 个字符显示。

例如摘要效果,需要显示 post.body 的前 54 的字符,那么可以在模板中使用 {{ post.body | truncatechars:54 }}。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏deepcc

JavaScript检测IE浏览器(最短代码)

4398
来自专栏编程

说说正则表达式的使用

今日分享:正则表达式 一:正则表达式的定义及用途 正则表达式是一种特殊的字符串,字符串中的每个字符都含有特定的意义。使用者通过将正则中不同的字符组合成不同的字符...

2018
来自专栏用户2442861的专栏

C++ STL空间配置源码分析以及实现一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1213
来自专栏CDA数据分析师

实用小工具,教你轻松转化Python通用数据格式

已独立成项目在github上面 dataformat, 涉及模块 os, getopt, sys。 1 需求 在进行hadoop测试时,需要造大量数据,例如某个...

2075
来自专栏linux驱动个人学习

【底层原理】深入理解Cache (下)

得到了我的PC的cache参数如下: L1 Cache : 32KB , 8路组相连,linesize为 64Byte 64个组

1572
来自专栏ACM算法日常

石子合并(区间动态规划)- NYOJ 737

有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的...

1062
来自专栏Laoqi's Linux运维专列

正则扩展练习

grep命令的-P选项: 最典型的用法是,匹配指定字符串之间的字符。 比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符...

4136
来自专栏尾尾部落

[剑指offer] 构建乘积数组

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*....

1423
来自专栏Golang语言社区

Golang语言--计算运行的时间

函数time.Since() 计算golang运行的时间是非常有用的性能衡量指标,特别是在并发基准测试中。下面将介绍如何简单地使用Go语言来计算程序运行的时间。...

3628
来自专栏C/C++基础

Linux命令(12)——wc命令

(3)从文件读取输入文件名。如果有多个文件名,并且希望 wc 从一个文件中读取它们,那么使用-files0-from 选项。这里将文件名称必须以NULL字符结束...

1061

扫码关注云+社区

领取腾讯云代金券