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%}
{%ifpage.has_previous%}
  • 上一页
  • {%else%} 上一页 {%endif%} {%fornuminpage_range%} {%ifnum==current_num%} {num} {%else%}
  • {num}
  • {%endif%} {%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分页器的使用方法”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!

    展开全文
    内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

    最新文章

    网站地图