django分页器的使用方法-mile米乐体育
这篇文章主要介绍了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如下
title {%forbookinbook_list%}
- {book.title}:{book.price}
{%endfor%}
这时一次性访问即展示了所有的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组件在页面模板中添加翻页的按钮,在当前页时按钮加深,没有上一页时禁止点击
...
- {%forbookinpage%}
- {book.title}:{book.price} {%endfor%}
在视图函数中:处理相关异常;传递相关参数;当页码较多时只显示部分页码,例如最多时总共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==
可以在自定义类中定义的属性有:
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分页器的使用方法”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!