首页 > 其他分享 >二十二、分页

二十二、分页

时间:2024-02-11 23:44:38浏览次数:15  
标签:二十二 分页 self posts pages current num page

原理

def index(request):
    per_page_count = 10
    current_page=request.GET.get('p')
    # page=1 0,10 0-9
    # page=2 10,20 10-19
    current_page = int(current_page)
    start = (current_page - 1) * per_page_count
    end = current_page * per_page_count
    data=USER_LIST[start:end]
    return render(request,'index.html',{'user_list':data})

1、Django内置分页

def index1(request):
    from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
     # 全部数据:USER_LIST,=> 得出共有多少条数据
     # per_page: 每页显示条目数量
     # count: 数据总个数
     # num_pages: 总页数
     # page_range: 总页数的索引范围:如:(1,10),(1,200)
     # page: page对象(是否有下一页;是否有上一页)
    paginator = Paginator(USER_LIST, 10)
    current_page = request.GET.get("p")
    try:
         # page对象
         posts = paginator.page(current_page)
         #     han_next 是否有下一页
         #     next_page_number 下一页页码
         #     has_previous 是否有上一页
         #     previous_page_number 上一页页码
         #     object_list 分页之后的数据列表,已经切片好的数据
         #     number 当前页
         #     paginator paginator对象
     except PageNotAnInteger:
         posts = paginator.page(1)
     except EmptyPage:
         posts = paginator.page(paginator.num_pages)

     return render(request,'index1.html',{'posts':posts})
<body>
  <ul>
    {% for row in posts.object_list %}
    <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
  </ul>
  {% include 'include/pager.html' %}
</body>

将分页代码独立:在template下新建目录include,在include创建pager.html

{% if posts.has_previous %}
    <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% endif %}
{% if posts.has_next %}
    <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% endif %}
<span>
    {{ posts.number }} / {{ posts.paginator.num_pages }}
</span>

2、扩展django的内置分页

class MyPaginator(Paginator):
    def __init__(self,current_page,per_pager_num,*args,**kwargs):
        # 当前页
        self.current_page = int(current_page)
        # 最多显示的页码数量
        self.per_pager_num = int(per_pager_num)
        super(MyPaginator,self).__init__(*args,**kwargs)

    # 在页面中显示页码的范围
    def pager_num_range(self):
        if self.num_pages < self.per_pager_num:
            return range(1,self.num_pages+1)
        #  总页数特别多
        part = int(self.per_pager_num/2)
        if self.current_page <= part:
            return range(1,self.per_pager_num+1)
        if self.current_page >= self.num_pages - part:
            return range(self.num_pages - self.per_pager_num + 1,self.num_pages+1)
        return range(self.current_page - part, self.current_page + part + 1)
{% if posts.has_previous %}
    <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% endif %}
// 显示页码数字,提供跳转
{% for i in posts.paginator.pager_num_range %}
    {% if i == posts.number %}
        <a href="/index1.html?p={{ i }}" style="font-size: 30px;">{{ i }}</a>
    {% else %}
        <a href="/index1.html?p={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}
{% if posts.has_next %}
    <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% endif %}
<span>
    {{ posts.number }} / {{ posts.paginator.num_pages }}
</span>

3、自定义分页

传入:所有数据的个数、当前页、每页显示条数、最多页码个数

class Pagination(object):
   def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7):
       # 数据总个数
       self.total_count = totalCount
       # 当前页
       try:
          v = int(currentPage)
          if v<=0:
             v=1
          self.current_page = v
       except Exception as e:
          self.current_page = 1
       # 每页显示的行数
       self.per_page_item_num = perPageItemNum
       # 最多显示页码
       self.max_page_num = maxPageNum


    def start(self):
       return (self.current_page-1)*self.per_page_item_num

    def end(self):
       return self.current_page*self.per_page_item_num

    # @property 将方法伪装成属性
    @property
    def num_pages(self):
       """
       总页数
       """
       """divmod python函数 传入被除数和除数 返回 商和余数"""
       a,b = divmod(self.total_count,self.per_page_item_num)
       if b == 0:
          return a
       return a+1

    def pager_num_range(self):
       if self.num_pages < self.max_page_num:
          return range(1,self.num_pages+1)
       #  总页数特别多
       part = int(self.max_page_num/2)
       if self.current_page <= part:
          return range(1,self.max_page_num+1)
       if self.current_page >= self.num_pages - part:
          return range(self.num_pages - self.max_page_num + 1,self.num_pages+1)
       return range(self.current_page - part, self.current_page + part + 1)


    def page_str(self):
       page_list=[]

       first="<li><a href='/index2.html?p=1'>首页</a></li>"
       page_list.append(first)

       if self.current_page==1:
          prev="<li><a href='#'>上一页</a></li>"
       else:
          prev = "<li><a href='/index2.html?p=%s'>上一页</a></li>"%(self.current_page-1)
       page_list.append(prev)

       for i in self.pager_num_range():
          if i==self.current_page:
             temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
          else:
             temp = "<li><a href='/index2.html?p=%s'>%s</a></li>"%(i,i)
          page_list.append(temp)

       if self.current_page==self.num_pages:
          nex = "<li><a href='#'>下一页</a></li>"
       else:
         nex = "<li><a href='/index2.html?p=%s'>下一页</a>"%(self.current_page+1)
       page_list.append(nex)

       last="<li><a href='/index2.html?p=%s'>尾页</a></li>"%(self.num_pages)
       page_list.append(last)

       return ''.join(page_list)
<body>
  <ul>
    {% for row in data %}
    <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
  </ul>

  <ul class="pagination pagination-sm">
    {{ page_obj.page_str|safe }}
  </ul>
</body>

标签:二十二,分页,self,posts,pages,current,num,page
From: https://www.cnblogs.com/zhlforhe/p/18013629

相关文章

  • 后台没有调用分页方法,但是sql的执行却走了分页
    1、分页方法主要调用PageHelper.startPage()现象:开始是可以查询所有数据,在我调整前台代码以后,SQl查询就变为分页的了。因此,肯定是vue代码有问题,具体为啥前台代码会影响后台的分页呢?很是神奇。(计算机问题,表面上都有神秘的面纱哈哈哈)做法:(1)比对请求参数,发现比原来多了分页参数pa......
  • [office] Excel怎么设置从指定部分分页打印
    excel表格中的指定一部分数据想分成两页打印,该怎么设置呢?下面就跟小编一起看看吧。Excel设置从指定部分分页打印的步骤1、现有如下字段:按班级进行打印。一班的同学打印在一张纸上。二班的同学打印在一张纸上!2、点击视图菜单下面的分页预览3、选择要分割的......
  • mongodb大数据量分页查询优化
    业务背景mongodb大数据量分页查询主要耗时是查询总条数,所以有两种优化方式1.不查询总条数,查询最近N页数据[改动略多,执行耗时很短]2.增加页面时间范围必填条件[改动很小,执行耗时略长,与数据量有关][比如默认查询创建时间最近一个月的数据根据数据量做调整,创建时间有组合索引]这两种......
  • MyBatis使用分页插件
    MyBatis使用分页插件PageHelper是国内非常优秀的开源mybatis分页插件,它支持基本主流与常用的数据库,例如:mysql、Oracle、DB2等。PageHelper在GitHub的项目地址:https://github.com/pagehelper/Mybatis-PageHelper分页插件的原理(1)在MyBatis执行SQL语句之前,拦截器可以获取SQL......
  • kettle从入门到精通 第三十八课 kettle 分页全量同步(数据量大)
    1、上一课我们学习了在数据量小的情况下的全量同步示例,本次我们一起学习下kettle分页全量同步。2、kettle分页全量同步示例依然基于test数据库,从t1表全量同步数据到t2表,由于t1表的数据比较大,所以选择分页全量同步策略,如下图所示。前提:a、基于mysql数据库b、分页查询数据基......
  • sprinboot实现分页查询
    1.环境介绍:springboot2.7.4pagehelper1.4.6mybatis-plus3.5.12.需求分析通过前端传回的分页要求的参数<页码,页数据量>,返回结果实现{"code":0,"message":"操作成功","data":{"total":5,"items&quo......
  • spring boot分页
    0verridepublicPair<List<ApplyDto>,Long>selectDbApplyList(ApplyDtoapplyDto){Longid=applyDto.getId();//办事顺信DbSupervisiondbSupervision=abSupervisionMapper.selectDbSupervisionByDbId(id);if(dbSupervision==null){thrownewRuntimeExcep......
  • 面试官:Mysql千万级大表如何进行深度分页优化?
    背景假如有一张千万级的订单表,这张表没有采用分区分表,也没有使用ES等技术,分页查询进行到一定深度分页之后(比如1000万行后)查询比较缓慢,我们该如何进行优化?数据准备订单表结构如下:CREATETABLE`t_order`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT......
  • MySQL大表分页查询的坑以及解决方案
    最近在做一个需求,需求内容中有一个功能点是查询指定用户标签里的用户id,这里做了分页查询,分页查询是用mysql的LIMIT设置offset和size值来实现的。在程序执行过程中会发现,如果查询的用户标签数据量很大时会出现慢查询告警,这里已经对mysql表的标签名称和用户id字段都加了索引,并且limi......
  • Android的ListView分页功能(上滑加载更多)
    Android的ListView分页功能(上滑加载更多)首先要定义一个footer.xml作为进度条和提示加载中的底部布局,代码如下:<LinearLayoutandroid:id="@+id/load_layout"android:layout_width="match_parent"android:layout_height="wrap_content"......