Django 分页

Django分页的常用方法

  1. django 提供了一个Paginator的方法

    from django.core.paginator import Paginator
    
  2. 实例化对象

    paginator = Paginator(datalist,per_page)  # 里面传两个参数 数据和每页显示的记录数
    
  3. 获取数据的分页范围

    page_range = paginator.page_range  # 获取数据的分页范围 range(1,x) 从第一页到第x-1页
    
  4. 获取每页的数据

    page_list = paginator.page(num) # 传入页码 获取当前页的数据
    
  5. 获取总页数

    total_page = paginator.num_pages
    
  6. 指定显示的页数

    # 当前页码
    current_num = int(request.GET.get("page", 1))  
    #  显示方式
    # 一般网页展示11页,左5页,右5页,加上当前页,共11页
    # 11 就是可显示的页数 
    # 5 就是中位数 => 总页数//2
    if paginator.num_pages > 11:  
        if current_num - 5 < 1:  # 如果前5页小于1时
            pageRange = range(1, 11)  # 页码的列表:范围是初始状态
        elif current_num + 5 > paginator.num_pages:  # 如果后5页大于总页数时
            # 页码的列表:范围是(当前页-5,总页数+1)。因为range顾头不顾尾,需要加1
            pageRange = range(current_num - 5, paginator.num_pages + 1)
        else:
            # 页码的列表:后5页正常时,页码范围是(当前页-5,当前页+6)。注意不是+5,因为range顾头不顾尾!
            pageRange = range(current_num - 5, current_num + 6)
    else:
        pageRange = paginator.page_range  # 页码的列表
    
    
  7. 封装方法

     def get_page(self,pageobj,p,showPage=11):
         # 1.获取总页数
         totalPage = pageobj.num_pages
         # 2.获取中位数
         midPage = int(showPage/2)
         # 3.如果总页数大于可显示的页数
         if totalPage > showPage:
             # 5. 判断当前页如果小于中位数
             if p - midPage < 1:
                 page = [i for i in range(1,showPage+1)]
             elif p + midPage > totalPage:
                 # 6. 如果当前页+中位数大于总页数的话,那么只能是总页数-(中位数-1)到总页数+1
                 page = [i for i in range(totalPage-(showPage-1),totalPage+1)]
             else:
                 # 7. 如果在区间的话,应该是当前页-中位数到当前页+(中位数+1)
                 page = [i for i in range(p-midPage,p+midPage+1)]
         else:
             # 4. 当总页数小于可显示的页数的时候,全部显示
             page = [i for i in pageobj.page_range]
         return page
    
posted @   巫小诗  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示