零基础入手Django(十五):分页功能的实现 您所在的位置:网站首页 女神美丽 零基础入手Django(十五):分页功能的实现

零基础入手Django(十五):分页功能的实现

2023-04-08 14:48| 来源: 网络整理| 查看: 265

今天,小叮当来为大家继续分享Django的干货~

主要内容有:分页常见的属性和方法、具体实例、补充知识点

一、分页常见的属性和方法

(1)在blog的views.py中编写分页视图函数

代码如下:

from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage def page_test(request): #定义颜色 color = ['red','orange','yellow','green','blue','purper'] #实例化的分页对象 p = Paginator(color,2) #分页后的对象 print('我是分页后的对象',p) #1.属性 print('---------------属性--------------') #对象数量 print('我是对象数量',p.count) #分的页面数 print('我是分的页面数',p.num_pages) #页码的范围,从1开始 print('我是页码的范围,从1开始',p.page_range) #每页显示的对象 print('我是每页显示的对象',p.per_page) #获取第一页的分页对象 page1 = p.page(1) # 获取第二页的分页对象 page2 = p.page(2) #获取第一页的元素列表 print('我是第一页的元素列表',page1.object_list) #获取第二页的元素列表 print('我是第二页的元素列表',page2.object_list) #获取page1的页码值 print('我是page1的页码值',page1.number) #获取page2的页码值 print('我是page2的页码值',page2.number) #从page反查到Paginator实例对象p(查找上一级) print('我是从page反查到Paginator实例对象',page1.paginator) #2.方法 print('-------------------方法--------------------') #判断page1有没有下一页 print('我在判断page1有没有下一页',page1.has_next()) #判断page1有没有上一页 print('我在判断page1有没有上一页',page1.has_previous()) #判断page1是否有上一页或下一页 print('我在判断page1是否有上一页或下一页',page1.has_other_pages()) #获取page1下一页的页码 print('我在获取page1下一页的页码',page1.next_page_number()) #获取page2上一页的页码 print('我在获取page2上一页的页码',page2.previous_page_number()) #获取page1的第一个对象的索引 print('我在获取page1的第一个对象的索引',page1.start_index()) #获取page1的最后一个对象的索引 print('我在获取page1的最后一个对象的索引',page1.end_index()) return HttpResponse('小叮当在进行分页测试')

(2)在blog下的urls.py中配置路由

代码如下

path('ptest', views.page_test, name='page_test'),

(3)在浏览器中访问相应地址触发视图函数

(4)在后台查看

二、具体实例

(1)在templates下的blog中的demo_base.html中添加进入博客主页的a标签

代码如下

进入博客主页

(2)在浏览器中进入博客主页,添加一定数量的博客,以供分页

添加后在文章列表中查看

共有博客12篇

(3)进入blog下的views.py中的blog_list视图函数中,编写分页功能

代码如下

from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage def blog_list(request): #从数据库中获取博客数据,并按id排序 blogs = BlogModel.objects.all().order_by('id') #进行分页,4个为1页 p = Paginator(blogs,4) #获取当前的页码 page = request.GET.get('new_page') try: #当前页对象 pages = p.page(page) except PageNotAnInteger: # 如果传的页面不是整数,默认跳转到第一页 pages = p.page(1) except EmptyPage: #如果传的页面为空,则传分的页面数 pages = p.page(p.num_pages) # 以上的语句从try开始到except的也可用 pages = p.get_page(page)进行替换,不过这是django2.0特有的 return render(request,'blog/demo_list.html',context={'pages':pages})

(4)在templates下的blog中的demo_list.html中修改模版页面

{% extends 'blog/demo_base.html' %} {% block title %} 文章列表 {% endblock %} {% block bodyblock %} 文章列表 标题 操作 {% for blog in pages %} {{ blog.title }} 编辑 | 删除 {% endfor %} {#有没有上一页,有没有下一页#} {% if pages.has_previous %} 上一页 {% endif %} {# 显示方式一:分数形式#} {{ pages.number }}/{{ pages.paginator.num_pages}} {% if pages.has_next %} 下一页 {% endif %} {# 显示方式二:列表形式#} {% for i in pages.paginator.page_range %} {% if i == pages.number %} {{ i}} {% else %} {{ i }} {% endif %} {% endfor %} {% endblock %}

(5)在浏览器中查看

点击下一页

可见分页功能已成功实现。

三、补充知识点

类中装饰器的使用

在django的视图函数中,若想对类使用装饰器,

只需使用method_decorator方法即可。

代码举例如下:

from django.utils.decorators import method_decorator #定义类视图,添加博客 class BlogAdd(View): @method_decorator(permission_required('blog_add_blogmodel')) def get(self,request): return render(request,'blog/demo_add.html')



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有