有局限性分页+斗笔式自定义分页组件

有局限性分页+斗笔式自定义分页组件,第1张

概述利用django自带分页组件实现分页功能 使用分页器Paginator: 在视图中使用 Paginator来为查询集分页。我们提供视图以及相关的模板来展示如何展示这些结果。 Paginator常用属性per_page: 每页显示条目数量count: 数据总个数num_pages:总页数page_range:总页数的索引范围,页码的范围,从1开始,例如[1, 2, 3, 4]   P 利用django自带分页组件实现分页功能

使用分页器Paginator:

在视图中使用 Paginator来为查询集分页。我们提供视图以及相关的模板来展示如何展示这些结果。

Paginator常用属性per_page: 每页显示条目数量count: 数据总个数num_pages:总页数page_range:总页数的索引范围,页码的范围,从1开始,例如[1,2,3,4]  

Paginator所需参数:

object_List 一个列表,元祖或则Django 的queryset 对象 或其他对象带有 count() or __len__()的方法per_page :就是1页显示几条数据  

Paginator对象的方法:

page(number) :返回在提供的下标处的Page对象,下标以1开始

使用page对象方法:

Page.has_next()如果有下一页,则返回True Page.has_prevIoUs()如果有上一页,返回 True Page.has_other_pages()如果有上一页或下一页,返回True Page.next_page_number()返回下一页的页码。如果下一页不存在,抛出InvalIDPage异常 Page.prevIoUs_page_number()返回上一页的页码。如果上一页不存在,抛出InvalIDPage异常 Page.start_index()返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3 Page.end_index()返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index() 会返回 4

 属性

Page.object_List当前页上所有对象的列表 Page.number当前页的序号,从1开始 Page.paginator相关的Paginator对象。

自带分页功能代码

 1 """fbv_cbv URL Configuration 2  3 The `urlpatterns` List routes URLs to vIEws. For more information please see: 4     https://docs.djangoproject.com/en/2.1/topics/http/urls/ 5 Examples: 6 Function vIEws 7     1. Add an import:  from my_app import vIEws 8     2. Add a URL to urlpatterns:  path(‘‘,vIEws.home,name=‘home‘) 9 Class-based vIEws10     1. Add an import:  from other_app.vIEws import Home11     2. Add a URL to urlpatterns:  path(‘‘,Home.as_vIEw(),name=‘home‘)12 Including another URLconf13     1. import the include() function: from django.urls import include,path14     2. Add a URL to urlpatterns:  path(‘blog/‘,include(‘blog.urls‘))15 """16 from django.contrib import admin17 from django.urls import path,re_path18 from app01 import vIEws19 20 urlpatterns = [21     path(admin/,admin.site.urls),22     path(index/,vIEws.index),# 自带分页23 ]
urls.py

 1 from django.db import models 2  3  4 class UserType(models.Model): 5     Title = models.CharFIEld(max_length=32) 6  7  8 class UserInfo(models.Model): 9     username = models.CharFIEld(max_length=32)10     password = models.CharFIEld(max_length=64)11     age = models.IntegerFIEld()12     ut = models.ForeignKey(UserType,on_delete=models.CASCADE)13 14     def __str__(self):15         return %s--%s % (self.ID,self.username)
models.py

 1 from django.shortcuts import render,httpResponse 2 from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage 3 from app01 import models 4  5  6 def index(request): 7     """ 8     Django自带的分页功能 局限性:不能在其他框架中用  而且只能做到上一页 下一页的位置 9     :param request:10     :return:11     """12 13     # for i in range(300):14     #     username = "root" + str(i)15     #     models.UserInfo.objects.create(username=username,age=18,ut_ID=1)16     current_page = request.GET.get(page)17     user_List = models.UserInfo.objects.all()18     paginator = Paginator(user_List,10)19     # per_page: 每页显示条目数量1020     # count:    数据总个数21     # num_pages:总页数22     # page_range:总页数的索引范围,如: (1,10),(1,200)23     # page:     page对象24     try:25         posts = paginator.page(current_page)26     except PageNotAnInteger as e:27         posts = paginator.page(1)28     except EmptyPage as e:  # 传入负数异常29         posts = paginator.page(1)30     # has_next              是否有下一页31     # next_page_number      下一页页码32     # has_prevIoUs          是否有上一页33     # prevIoUs_page_number  上一页页码34     # object_List           分页之后的数据列表35     # number                当前页36     # paginator             paginator对象37     return render(request,index.HTML,{"posts": posts})
vIEws.py
<!DOCTYPE HTML><HTML lang="en"><head>    <Meta charset="UTF-8">    <Title></Title></head><body>    <h2>用户列表数据</h2>    <ul>        {% for row in posts.object_List  %}            <li>{{ row.username  }}</li>        {% endfor %}    </ul>    <div>        {% if posts.has_prevIoUs %}            <a href="?page={{ posts.prevIoUs_page_number }}">上一页</a>        {% endif %}        {% for num in posts.paginator.page_range %}            <a href="?page={{ num }}">{{ num }}</a>        {% endfor %}                {% if posts.has_next %}            <a href="?page={{ posts.next_page_number }}">下一页</a>        {% endif %}    </div></body></HTML>

自带分页实现的效果

  

总结下自带的分页:1.局限性太强,不能在其它框架中用2.只能做到上一页下一页位置3.如果数据库数据非常多,页码全部展示在一个页面肯定是不好的

自定义分页功能

实现主要思想:1.创建一个类,封装用户传递的页码、统计数据库总的个数、每页显示的数据条数、展示的页码数量、基本的url路径

       2.在类中实现当前页面的起始位置数据

       3.在页面上展示的页码条数以及上页下页(处理上页下页逻辑多做出判断) 

 

 1 """fbv_cbv URL Configuration 2  3 The `urlpatterns` List routes URLs to vIEws. For more information please see: 4     https://docs.djangoproject.com/en/2.1/topics/http/urls/ 5 Examples: 6 Function vIEws 7     1. Add an import:  from my_app import vIEws 8     2. Add a URL to urlpatterns:  path(‘‘,22     path(custom/,vIEws.custom),# 自定义分页23 ]
urls.py

  1 from django.shortcuts import render,httpResponse  2 from django.core.paginator import Paginator,EmptyPage  3 from app01 import models  4   5   6 class PageInfo(object):  7     def __init__(self,current_page,all_count,per_page,base_url,show_page=11):  8         """  9  10         :param current_page: 当前用户传递的页码 11         :param all_count:    数据库总的多少条个数 12         :param per_page:     每页显示的数据条数 13         :param show_page:    看到页码的最大值  前5条加后5条+当前页 14         :param base_url:     url路径 15         """ 16         try: 17             self.current_page = int(current_page) 18         except Exception as e: 19             self.current_page = 1 20         self.per_page = per_page 21  22         a,b = divmod(all_count,per_page) 23         if b: 24             a = a + 1 25         self.all_pager = a 26         self.show_page = show_page 27         self.base_url = base_url 28  29     def start(self): 30         return (self.current_page-1)*self.per_page 31  32     def end(self): 33         return self.current_page*self.per_page 34  35     def pager(self): 36         # v = "<a href=‘/custom/?page=6‘>6</a>" 37         # return v 38         page_List = [] 39         # 调整起始位置就可以在当前页码前几个显示出来后几页显示出来 40         harf = int((self.show_page-1)/2)  # 5 41         # begin = self.current_page - harf 42         # stop = self.current_page + harf + 1 43 # 判断起始 结束  加中间页码的逻辑 44         # 如果数据总页数小于11(默认页码显示的最大值) 45         if self.all_pager < self.show_page: 46             begin = 1 47             stop = self.all_pager + 1 48         # 如果数据总页数大于11(默认页码显示的最大值) 49         else: 50             # 如果当前页<=5  就永远显示1,11页 51             if self.current_page <= harf: 52                 begin = 1 53                 stop = self.show_page + 1 54             else: 55                 # 这里注意  如果后边没数据浏览的页码大于全部页码时候也要进行处理 56                 if self.current_page + harf > self.all_pager: 57                     begin = self.all_pager - self.show_page + 1 58                     stop = self.all_pager + 1 59                 else: 60                     begin = self.current_page - harf 61                     stop = self.current_page + harf + 1 62  63         # begin = self.current_page - 5 64         # stop = self.current_page + 5 + 1 65         if self.current_page <= 1: 66             prev = "<li><a href=‘#‘>上一页</a></li>" 67         else: 68             prev = "<li><a href=‘%s?page=%s‘>上一页</a></li>" % (self.base_url,self.current_page - 1) 69         page_List.append(prev) 70  71         for i in range(begin,stop): 72             if i == self.current_page: 73                 temp = "<li class=‘active‘><a href=‘%s?page=%s‘>%s</a></li>" % (self.base_url,i,) 74             else: 75                 temp = "<li><a href=‘%s?page=%s‘>%s</a></li>" % (self.base_url,) 76             page_List.append(temp) 77  78         if self.current_page >= self.all_pager: 79             nex = "<li><a href=‘#‘>下一页</a></li>" 80         else: 81             nex = "<li><a href=‘%s?page=%s‘>下一页</a></li>" % (self.base_url,self.current_page + 1) 82         page_List.append(nex) 83  84         return ‘‘.join(page_List) 85  86  87 def custom(request): 88     """ 89     自定义分页 90     :param request: 91     :return: 92     """ 93     # 假设当前页为第5页 94     current_page = request.GET.get(page) 95     all_count = models.UserInfo.objects.all().count() 96     # current_page = int(current_page) 97     # 每页显示的数据个数 98     per_page = 10 99     # 1   [0  10]100     # 2   [10  20]101     # 3   [20  30]102     page_info = PageInfo(current_page,/custom/,11)103     # start = (current_page-1)*per_page104     # end = current_page*per_page105     # user_List = models.UserInfo.objects.all()[开始位置:结束位置]106     user_List = models.UserInfo.objects.all()[page_info.start(): page_info.end()]107 108     return render(request,"custom.HTML",{"user_List": user_List,"page_info": page_info})
vIEws.py
<!DOCTYPE HTML><HTML lang="en"><head>    <Meta charset="UTF-8">    <Title></Title>    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/CSS/bootstrap.CSS"></head><body>    <h2>用户列表数据</h2>    <ul>        {% for row in user_List  %}            <li>{{ row.username  }}</li>        {% endfor %}    </ul>    <nav aria-label="Page navigation">    <ul >           {{ page_info.pager | safe }}    </ul></nav></body></HTML>

 静态文件的加载就不上传了  下载下来用就是了 

 自带分页器+自定义分页目录

 

        数据少时,大于总页数就没数据了的处理

  处理默认显示的总的页码(11页)的问题 数据少显示出来的负数页面

总结

以上是内存溢出为你收集整理的有局限性分页+斗笔式自定义分页组件全部内容,希望文章能够帮你解决有局限性分页+斗笔式自定义分页组件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1195633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存