资讯专栏INFORMATION COLUMN

Django搭建个人博客:文章分页

stormgens / 557人阅读

摘要:随着时间的推移加上勤奋的写作,你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。这个时候就需要对文章进行分页的处理。有疑问请在杜赛的个人网站留言,我会尽快回复。

随着时间的推移(加上勤奋的写作!),你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。

这个时候就需要对文章进行分页的处理。

利用轮子

写一个完善的分页功能是有些难度的,好在Django已经帮你准备好一个现成的分页模块了(Django把大部分基础功能都替你准备好了!)。内置模块虽然简单,但是对博客来说完全足够了。

我们要用到的是Paginator类。在Shell中可以充分尝试它的用法:

>>> from django.core.paginator import Paginator
>>> objects = ["john", "paul", "george", "ringo"]
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
range(1, 3)

>>> page1 = p.page(1)
>>> page1

>>> page1.object_list
["john", "paul"]

>>> page2 = p.page(2)
>>> page2.object_list
["george", "ringo"]
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.previous_page_number()
1
这是一个官网的例子。详见:Pagination

有了这个类,剩下的工作就是把它应用到项目中去。

轻车熟路

要对文章列表分页,因此就要修改article/views.pydef article_list()视图:

article/views.py

...
# 引入分页模块
from django.core.paginator import Paginator

def article_list(request):
    # 修改变量名称(articles -> article_list)
    article_list = ArticlePost.objects.all()

    # 每页显示 1 篇文章
    paginator = Paginator(article_list, 1)
    # 获取 url 中的页码
    page = request.GET.get("page")
    # 将导航对象相应的页码内容返回给 articles
    articles = paginator.get_page(page)

    context = { "articles": articles }
    return render(request, "article/list.html", context)

...

在视图中通过Paginator类,给传递给模板的内容做了手脚:返回的不再是所有文章的集合,而是对应页码的部分文章的对象,并且这个对象还包含了分页的方法。

我们在前面的文章已经接触过一些将参数传递到视图的手段了:

通过POST请求将表单数据传递到视图

通过url将地址中的参数传递到视图

这里用到了另一种方法:在GET请求中,在url的末尾附上?key=value的键值对,视图中就可以通过request.GET.get("key")来查询value的值。

然后改写模板,在最末尾的

前面,加入分页的内容:

templates/article/list.html

...




...

内容也比较简单,用到了前面的Shell中演示的部分方法,判断当前页所处的位置。

这样就行了!补充几篇文章(笔者共6篇),方便测试。刷新页面后是这样的:

视图中设置了每页只有1篇文章,所以就真的只有1篇了。

当然这只是为了测试,实际环境中肯定要远大于1篇的。

点击第2页的按钮后是这样的:

看到顶部地址栏中的变化了吗?

思考一下page是如何从模板传递到视图的。

总结

除模板外,我们只写了4行代码,就有了还不错的分页导航,Django就是这么贴心。

除了对文章列表,你可以对任何你想分页的地方运用此模块(比如以后要讲到的评论),满足用户各类的需求。

读者还可以稍加阅读Bootstrap 4官方文档,改写一个符合自己品味的外观。


有疑问请在杜赛的个人网站留言,我会尽快回复。

或Email私信我:dusaiphoto@foxmail.com

项目完整代码:Django_blog_tutorial

转载请并注明出处。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42834.html

相关文章

  • Django搭建个人博客:根据浏览量对最热文章排序

    摘要:有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示最热文章。它也是可以传递多个参数的,如,参数间用隔开视图根据参数的值,判断取出的文章如何排序方法指定对象如何进行排序。 有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示最热文章。 现在你已经很熟悉MTV模式,不需要我啰嗦也能完成任务: ...

    kidsamong 评论0 收藏0
  • Django 学习小组:博客开发实战第三周教程——文章列表分页和代码语法高亮

    摘要:本教程内容已过时,更新版教程请访问博客开发入门教程。当分页较多时,总是显示当前页及其前几页和后几页的页码教程中使用的是两页,其他页码用省略号代替。 本教程内容已过时,更新版教程请访问: django 博客开发入门教程。 摘要:前两期教程我们实现了博客的 Model 部分,以及 Blog 的首页视图 IndexView,详情页面 DetailView,以及分类页面 CategoryVi...

    Luosunce 评论0 收藏0
  • Django搭建个人博客:创建并配置APP功能模块

    摘要:创建在中的一个代表一个功能模块。就是项目的基石,因此开发博客的第一步就是创建新的,用来实现跟文章相关的功能模块。注意之后,的必须配置,否则会报错。总结本章创建了博客文章功能的,学习了注册并配置。 创建APP 在Django中的一个app代表一个功能模块。开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。app就是项目的基石,因此开发博客的第一步就是创建新的app,用来实现...

    沈俭 评论0 收藏0
  • Django搭建个人博客:编写博客文章的Model模型

    摘要:在里写一个数据库驱动的应用的第一步是定义模型,也就是数据库结构设计和附加的其它元数据。模型元数据是任何不是字段的东西,例如排序选项数据库表名单数和复数名称和。 Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。 它们各自的职责如下: 层次 职责 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取...

    winterdawn 评论0 收藏0
  • Django搭建个人博客:结束和开始

    摘要:教程看到这里,你已经学会如下内容搭建开发环境博文管理用户管理发表评论若干小功能搭建简单的小博客,以上的功能够用了。教程为了起步平缓,没有展开这方面的内容。陌生人,祝你学业进步事业有成欢迎常到杜赛的个人网站做客 教程看到这里,你已经学会如下内容: 搭建开发环境 博文管理 用户管理 发表评论 若干小功能 搭建简单的小博客,以上的功能够用了。 相信你的志向不止于此。毕竟程序员面试个个造火...

    zqhxuyuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<