功能分析
上周,为我的博客加入了上/下一篇的功能。这个小功能比较简单,重点仍然在于如何查。
拿我当前的站点举例,我的 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,我们只需要使用 <
或 >
以及 DESC
或 ASC
就可轻松完成这一效果,假设当前 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中的效果,我们只需要使用 DESC
或 ASC
稍加排序即可:
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:
至此,功能就完成了!