• 西游之路——python全栈——Django内置分页及拓展


     

    python---自定义分页类

     

    一、views.py操作(后台数据获取)

     1 from django.shortcuts import render
     2 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,Page
     3 
     4 USER_LIST = []
     5 for i in range(1,666):
     6     tem = {'name':'root'+str(i), 'age':i}
     7     USER_LIST.append(tem)
     8 
     9 def index(request):
    10     current_page = request.GET.get('p')
    11     current_page = int(current_page)
    12     per_page_count = 10
    13     '''
    14     p=1
    15     索引:0-10    取值:0-9
    16     p=2
    17     索引:10-20   取值:10-19
    18     '''
    19     start = (current_page-1)*per_page_count
    20     end = current_page*per_page_count
    21     data = USER_LIST[start:end]
    22 
    23     prev_page = current_page-1
    24     next_page = current_page+1
    25     return render(request, 'pager.html',{'user_list':data, 'prev_page':prev_page, 'next_page':next_page})
    26 
    27 # Django内置分页拓展
    28 class CustomPaginator(Paginator):  # 修改类
    29     def __init__(self,current_page, per_page_num,*args,**kwargs):
    30         # 当前页
    31         self.current_page = int(current_page)
    32         # 最多显示页码数 11
    33         self.per_page_num = int(per_page_num)
    34         super(CustomPaginator, self).__init__(*args,**kwargs)
    35 
    36     def pager_num_range(self):
    37         # 当前页
    38         # self.current_page
    39         # 最多显示页码数 11
    40         # self.per_page_num
    41         # 总页数
    42         # self.num_pages
    43         # 判断最小极值
    44         if self.per_page_num > self.num_pages:
    45             # 根据当前页动态生成,设置页面显示数
    46             return range(1, self.num_pages + 1)
    47         # 总页数特别多时
    48         part = int(self.per_page_num/2)
    49 
    50         if part >= self.current_page:
    51             return range(1, self.per_page_num + 1)
    52         # 判断最大极值
    53         if (self.current_page + part) >= self.num_pages:
    54             return range(self.num_pages - self.per_page_num + 1, self.num_pages + 1)
    55         return range(self.current_page - part, self.current_page + part +1)
    56 
    57 def index1(request):
    58 
    59     current_page = request.GET.get('p')
    60     # per_page: 每页显示条目数量
    61     # count:数据总个数
    62     # num_pages: 总页数
    63     # page_range: 总页数的索引范围,页码范围,如:(1,10),(1,200)
    64     # page:page对象(是否具有上一页,是否有下一页)
    65     paginator = CustomPaginator(current_page,7,USER_LIST,10)   # USER_LIST为总数据    10为每页条数
    66     try:
    67         posts = paginator.page(current_page)
    68         # has_next              是否有下一页
    69         # next_page_number      下一页页码
    70         # has_previous          是否有上一页
    71         # previous_page_number  上一页页码
    72         # object_list           分页之后的数据列表
    73         # number                当前页
    74         # paginator             paginator对象
    75     except PageNotAnInteger:
    76         posts = paginator.page(1)
    77     except EmptyPage:
    78         posts = paginator.page(paginator.num_pages)
    79 
    80     return render(request,'index1.html',{'posts':posts})

    二、HTML操作(前端代码)

        拓 展

    1 <ul>
    2     {% for row in posts.object_list %}
    3         <li>{{row.name}}-{{row.age}}</li>
    4     {% endfor %}
    5 </ul>
    6 
    7 {# 使用include调用pager #}
    8 {% include 'include/pager.html' %}

          pager.html

     1 {% if posts.has_previous %}
     2     <a href="/index1.html?p={{posts.previous_page_number}}">上一页</a>
     3 {% else %}
     4     <a href="#">上一页</a>
     5 {% endif %}
     6 <a href="/index1.html?p={{1}}">首页</a>
     7 {% for i in posts.paginator.pager_num_range %}
     8     {% if i == posts.number %}
     9         <a href="/index1.html?p={{i}}"  style="font-size: 30px;">{{i}}</a>
    10     {% else %}
    11         <a href="/index1.html?p={{i}}" >{{i}}</a>
    12     {% endif %}
    13 {% endfor %}
    14 <a href="/index1.html?p={{posts.paginator.num_pages}}">尾页</a>
    15 {% if posts.has_next %}
    16     <a href="/index1.html?p={{posts.next_page_number}}">上一页</a>
    17 {% else %}
    18     <a href="#">下一页</a>
    19 {% endif %}
    20 <span>
    21     {{posts.number}}/{{posts.paginator.num_pages}}
    22 </span>

    三、学习内容归纳

     1 分页组件
     2     - Django内置分页
     3         - paginator、page
     4         - 页面:include
     5 
     6     - 扩展Django内置分页
     7         - class CustomPaginator(Paginator):
     8     传入:
     9         - 所有数据
    10         - 每页行数
    11         - 当前页
    12         - 最多页面数
    13 
    14 
    15     - 自定义分页
    16     传入:
    17         - 所有数据的个数
    18         - 每页行数
    19         - 当前页
    20         - 最多页面数
  • 相关阅读:
    几种排序(c#实现)
    仿 MVC 三大特性
    自定义顺序表ArrayList
    MSMQ消息队列
    IIS 负载均衡(ARR)
    AOP 编程
    SqlServer 存储过程
    mac下mysql5.7.10密码问题
    gearman参数说明
    增加响应header让ajax支持跨域
  • 原文地址:https://www.cnblogs.com/Lujun1028/p/9604007.html
Copyright © 2020-2023  润新知