根据当前文章显示上一篇和下一篇文章

3,421 阅读2分钟

功能分析

上周,为我的博客加入了上/下一篇的功能。这个小功能比较简单,重点仍然在于如何查。

拿我当前的站点举例,我的 blog_post 表中现在有31条文章数据。

当路由为 文章详情页 时,服务端自然能知道当前文章的 ID,现在我们需要根据当前文章 ID 去表中查询出它的左右临近两条数据:

1. 当 ID=1 时,即整个表中的第一条数据,那么上一篇为 ID=31,下一篇为 ID=2;

2. 当 2≤ID≤30 时,上一篇为 ID-1,下一篇为 ID+1;

3. 当 ID=31 时,即整个表中的最后一条数据,那么上一篇为 ID=30,下一篇为 ID=1;

这样,每当有人来访问我的站点,浏览文章时,到达底部后,他可以通过上一篇/下一篇不用再做其他操作,就能浏览完我的整个站点,并且站点的减少“跳出率”。

具体实现

我们先来做第2点,使用 SQL,我们只需要使用 <> 以及 DESCASC 就可轻松完成这一效果,假设当前 ID 为5,那么上一篇则为 ID=4,下一篇则为 ID=6:

上一篇:

SELECT id, title FROM blog_post WHERE id < 5 ORDER BY id DESC LIMIT 1;

下一篇:

SELECT id, title FROM blog_post WHERE id > 5 ORDER BY id ASC LIMIT 1;

若当前 ID 为1或31,即当前文章为第一篇或最后一篇,为了达到1、2中的效果,我们只需要使用 DESCASC 稍加排序即可:

ID=1,上一篇:

SELECT id, title FROM blog_post ORDER BY id ASC LIMIT 1;

ID=31,下一篇:

SELECT id, title FROM blog_post ORDER BY id DESC LIMIT 1;

使用 Django ORM

我们在 models 中定义两个方法,用于返回上一篇下一篇的文章数据:

templatetags 中,注册模板:

在 templates 中,编写 HTML:

至此,功能就完成了!laugh