Django分页器的使用方法
这篇文章主要介绍了Django分页器的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
Django是一个大而全的框架。需要明确的是,传参进行分页获取分页后的数据,一般都是通过向服务器发送get请求的方式实现的,在向后端服务发送查看数据的同时可以携带一个或多个参数并发送get请求来实现分页查看功能
1、准备基础数据
设计表模型
为了体现分页的效果,需要先创建一个表并准备较多数据,模型如下
fromdjango.dbimportmodels #Createyourmodelshere. classBook(models.Model): title=models.CharField(max_length=32) price=models.DecimalField(max_digits=9,decimal_places=2)#9999999.99
执行数据库迁移后,设计一个视图函数,通过触发视图函数往此表中批量插入数据
Django中利用orm实现批量插入一般有两种方式:单条插入或者利用bulk_create批量插入
最终翻译转换成sql语句也就类似于多条insert语句和一条insert的区别
defcreate_book(request): #批量插入方式一 foriinrange(100): Book.objects.create(title="book"+str(i),price=i*i) #批量插入方式二 book_list=[] foriinrange(100): book=Book(title="book"+str(i),price=i*i) book_list.append(book) Book.objects.bulk_create(book_list) returnHttpResponse("添加成功")
2、一次性展示数据
接下来通过模板语法一次性将数据展示到前端页面
视图函数如下
defget_books(request): book_list=Book.objects.all() returnrender(request,"index.html",{"book_list":book_list})
模板页面index.html如下
<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Title</title> </head> <body> <ul> {%forbookinbook_list%} <li>{book.title}:{book.price}</li> {%endfor%} </ul> </body> </html>
这时一次性访问即展示了所有的book
3、引入分页器
引入分页器后,可以对全局分页对象和单页对象进行相关操作,相关语法
#引入分页器 fromdjango.core.paginatorimportPaginator ... #全局分页器对象 paginator=Paginator([1,2,3,4,5,6,7,8,9,10],3) print(paginator.count)#10数据总数 print(paginator.num_pages)#4总页数 print(paginator.page_range)#range(1,5)页码的列表 #单页对象 page=paginator.page(2) print(page.has_next())#是否有下一页 print(page.next_page_number())#写一页的页码 print(page.has_previous())#是否有上一页 print(page.previous_page_number())#上一页的页码 #取出单页对象的值 print(page.object_list)#[4,5,6] foriinpage: print(i)
在这里的例子中具体使用分页器及模板语法,例如每页取出8条,获取用户给出的页码条件数,返回相应页的数据,默认不给出任何条件时返回第一页的数据
fromdjango.core.paginatorimportPaginator #取出当前用户页码 current_num=int(request.GET.get("page",1)) book_list=Book.objects.all() paginator=Paginator(book_list,8) page=paginator.page(current_num) returnrender(request,"index.html",{"page":page})
最后,可以利用bootstrap组件在页面模板中添加翻页的按钮,在当前页时按钮加深,没有上一页时禁止点击
... <body> <ul> {%forbookinpage%} <li>{book.title}:{book.price}</li> {%endfor%} </ul> <navaria-label="Pagenavigation"> <ulclass="pagination"> {%ifpage.has_previous%} <li> <ahref="/?page={page.previous_page_number}"rel="externalnofollow"aria-label="Previous"> <spanaria-hidden="true">上一页</span> </a> </li> {%else%} <liclass="disabled"> <ahref="#"rel="externalnofollow"rel="externalnofollow"aria-label="Previous"> <spanaria-hidden="true">上一页</span> </a> </li> {%endif%} {%fornuminpage_range%} {%ifnum==current_num%} <liclass="active"><ahref="/?page={num}"rel="externalnofollow"rel="externalnofollow">{num}</a></li> {%else%} <li><ahref="/?page={num}"rel="externalnofollow"rel="externalnofollow">{num}</a></li> {%endif%} {%endfor%} <li> <ahref="#"rel="externalnofollow"rel="externalnofollow"aria-label="Next"> <spanaria-hidden="true">下一页</span> </a> </li> </ul> </nav> </body> ...
在视图函数中:处理相关异常;传递相关参数;当页码较多时只显示部分页码,例如最多时总共10个页码,当前页码始终在中间显示;单独处理出现边界情况,负数页码的情况及最大页码用完的情况
fromdjango.core.paginatorimportPaginator ... #取出当前用户页码 current_num=int(request.GET.get("page",1)) book_list=Book.objects.all() paginator=Paginator(book_list,8) page=paginator.page(current_num) #大于11页时 ifpaginator.num_pages>11: #当前页码的后5页数超过最大页码时,显示最后10项 ifcurrent_num+5>paginator.num_pages: page_range=range(paginator.num_pages-10,paginator.num_pages+1) #当前页码的前5页数为负数时,显示开始的10项 elifcurrent_num-5<1: page_range=range(1,12) else: #显示左5页到右5页的页码 page_range=range(current_num-5,current_num+5+1) #小于11页时显示所有页码 else: page_range=paginator.page_range returnrender(request,"index.html",{"page":page,"paginator":paginator,"current_num":current_num,"page_range":page_range})
附:drf分页器的使用
Django REST framework提供了分页的支持。
可以在配置文件中设置全局的分页方式,如:
REST_FRAMEWORK={ 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',#选用的分页器 'PAGE_SIZE':100#每页数目 }
也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。例如:
fromrest_framework.paginationimportPageNumberPagination classMyPageNumberPagination(PageNumberPagination): #设置url中的取多少页的key page_query_param='page' #设置url中设置取数据条数的key page_size_query_param='size' #设置每一页的数据条数 page_size=2 #设置每一页最多可取的数据数 max_page_size=5 classBook2View(ListAPIView): queryset=models.Book.objects.all() serializer_class=BookModelSerializer pagination_class=MyPageNumberPagination#指定该视图类的分页器
注意:如果在视图内关闭分页功能,只需在视图内设置pagination_class = None 即可,即在设置了全局分页之后我们可以在局部禁用该设置。
drf 提供给我们的分页器有PageNumberPagination、LimitOffsetPagination、CursorPagination。
1.1 PageNumberPagination
url形式:
http://127.0.0.1:8000/books/?page=1
可以在自定义类中定义的属性有:
page_query_param :设置url中页数的关键字,默认的是page。
page_size_query_param :设置url中每页数据条数的关键字,默认的是None。
page_size :设置每一页的数据条数。(必设)
max_page_size : 设置每一页最多可取的数据条数。(可选)
classMyPageNumberPagination(PageNumberPagination): page_size=2 page_query_param='page' page_size_query_param='size' max_page_size=5 classBook2View(ListAPIView): queryset=models.Book.objects.all() serializer_class=BookModelSerializer pagination_class=MyPageNumberPagination #APIView中使用自定义分页类进行分页操作 classPager(APIView): defget(self,request,*args,**kwargs): #获取所有数据 ret=models.Book.objects.all() #创建分页对象 page=MyPageNumberPagination() #在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) #对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) #returnResponse(ser.data) #这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解) returnpage.get_paginated_response(ser.data)
1.2 LimitOffsetPagination
url形式:
http://127.0.0.1/four/books/?limit=100&offset=400
可以在自定义类中定义的属性有:
default_limit :默认限制,默认值与PAGE_SIZE设置一致。
limit_query_param : limit参数名,默认为limit。
offset_query_param : offset参数名,默认offset。
max_limit : 最大limit限制,默认None。
classMyLimitOffsetPagination(LimitOffsetPagination): default_limit=3 limit_query_param='limit' max_limit=None offset_query_param='offset' classBook2View(ListAPIView): queryset=models.Book.objects.all() serializer_class=BookModelSerializer pagination_class=MyLimitOffsetPagination #APIView中使用自定义分页类进行分页操作 classPager(APIView): defget(self,request,*args,**kwargs): #获取所有数据 ret=models.Book.objects.all() #创建分页对象 page=LimitOffsetPagination() #在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) #对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) #returnpage.get_paginated_response(ser.data) returnResponse(ser.data)
1.3 CursorPagination
url形式:
http://127.0.0.1/four/books/?cursor=cD0xNQ%3D%3D
可以在自定义类中定义的属性有:
cursor_query_param:默认查询字段,不需要修改。
page_size:每页数目。
ordering:按什么排序,需要指定。
classMyCursorPagination(CursorPagination): cursor_query_param='cursor' page_size=2 ordering='-id' classBook2View(ListAPIView): queryset=models.Book.objects.all() serializer_class=BookModelSerializer pagination_class=MyCursorPagination #APIView中使用自定义分页类进行分页操作 classPager(APIView): defget(self,request,*args,**kwargs): #获取所有数据 ret=models.Book.objects.all() #创建分页对象 page=CursorPagination() page.ordering='nid' #在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) #对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) #可以避免页码被猜到 returnpage.get_paginated_response(ser.data)
感谢你能够认真阅读完这篇文章,希望小编分享的“Django分页器的使用方法”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!
推荐阅读
-
浅析Django接口版本控制
-
Django+Celery实现定时任务的示例
-
Python(django中如何使用restful框架)
-
Django实现drf搜索过滤和排序过滤
-
Django中怎么将ValuesQuerySet转换成json
今天就跟大家聊聊有关Django中怎么将ValuesQuerySet转换成json,可能很多人都不太了解,为了让大家更加了解,小编...
-
Python Django搭建文件下载服务器的实现shili
-
在Django中如何使用MQTT的方法
这篇文章主要介绍了在Django中如何使用MQTT的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有...
-
Django开发RESTful API怎么实现增删改查
-
Django如何显示可视化图表的实践
-
django中xadmin管理器常用显示的设置方式有哪些
这篇文章主要介绍了django中xadmin管理器常用显示的设置方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读...