• 分页


    1.Django内置分页(适用于:上一页    下一页)

     1 def index(request):
     2     """
     3     分页
     4     :param request:
     5     :return:
     6     """
     7     current_page = request.GET.get('page')
     8 
     9     user_list = models.UserInfo.objects.all()
    10     paginator = Paginator(user_list,10)
    11     # per_page: 每页显示条目数量
    12     # count:    数据总个数
    13     # num_pages:总页数
    14     # page_range:总页数的索引范围,如: (1,10),(1,200)
    15     # page:     page对象
    16     try:
    17         posts = paginator.page(current_page)
    18     except PageNotAnInteger as e:
    19         posts = paginator.page(1)
    20     except EmptyPage as e:
    21         posts = paginator.page(1)
    22     # has_next              是否有下一页
    23     # next_page_number      下一页页码
    24     # has_previous          是否有上一页
    25     # previous_page_number  上一页页码
    26     # object_list           分页之后的数据列表
    27     # number                当前页
    28     # paginator             paginator对象
    29     return render(request,'index.html',{'posts':posts})
    30 
    31 views.py
    Views.py
     1 <h1>用户列表</h1>
     2 <ul>
     3     {% for row in posts.object_list %}
     4         <li>{{ row.name }}</li>
     5     {% endfor %}
     6 </ul>
     7 <div>
     8     {% if posts.has_previous %}
     9         <a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
    10     {% endif %}
    11 
    12     {% if posts.has_next %}
    13         <a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
    14     {% endif %}
    15 </div>
    16 
    17 index.py
    index.html

    2.自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。

      1、设定每页显示数据条数

      2、用户输入页码(第一页、第二页...)

      3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

      4、在数据表中根据起始位置取值,页面上输出数据


    需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

      1、设定每页显示数据条数

      2、用户输入页码(第一页、第二页...)

      3、设定显示多少页号

      4、获取当前数据总条数

      5、根据设定显示多少页号和数据总条数计算出,总页数

      6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

      7、在数据表中根据起始位置取值,页面上输出数据

      8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

     1 class PageInfo(object):
     2 
     3     def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
     4         """
     5 
     6         :param current_page:
     7         :param all_count: 数据库总行数
     8         :param per_page: 每页显示行数
     9         :return:
    10         """
    11         try:
    12             self.current_page = int(current_page)
    13         except Exception as e:
    14             self.current_page = 1
    15         self.per_page = per_page
    16 
    17         a,b = divmod(all_count,per_page)
    18         if b:
    19             a = a +1
    20         self.all_pager = a
    21         self.show_page = show_page
    22         self.base_url = base_url
    23     def start(self):
    24         return (self.current_page-1) * self.per_page
    25 
    26     def end(self):
    27         return self.current_page * self.per_page
    28 
    29 
    30     def pager(self):
    31         # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
    32         # return v
    33         page_list = []
    34 
    35         half = int((self.show_page-1)/2)
    36 
    37         # 如果数据总页数 < 11
    38         if self.all_pager < self.show_page:
    39             begin = 1
    40             stop = self.all_pager + 1
    41         # 如果数据总页数 > 11
    42         else:
    43             # 如果当前页 <=5,永远显示1,11
    44             if self.current_page <= half:
    45                 begin = 1
    46                 stop = self.show_page + 1
    47             else:
    48                 if self.current_page + half > self.all_pager:
    49                     stop = self.all_pager + 1
    50                     begin = self.all_pager - self.show_page + 1
    51                 else:
    52                     begin = self.current_page - half
    53                     stop = self.current_page + half + 1
    54 
    55         if self.current_page <= 1:
    56             prev = "<li><a href='#'>上一页</a></li>"
    57         else:
    58             prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,)
    59         page_list.append(prev)
    60 
    61         for i in range(begin,stop):
    62             if i == self.current_page:
    63                 temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
    64             else:
    65                 temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
    66             page_list.append(temp)
    67 
    68         if self.current_page >= self.all_pager:
    69             nex = "<li><a href='#'>下一页</a></li>"
    70         else:
    71             nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,)
    72         page_list.append(nex)
    73 
    74 
    75         return ''.join(page_list)
    76 
    77 utils/pager.py
    utils/pager.py
    models.py
    custom.html
     1 from utils.pager import PageInfo
     2 def custom(request):
     3     # 表示用户当前想要访问的页码:
     4 
     5     all_count = models.UserInfo.objects.all().count()
     6 
     7     page_info = PageInfo(request.GET.get('page'),all_count,10,'/custom.html',11)
     8     user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]
     9 
    10     return render(request,'custom.html',{'user_list':user_list,'page_info':page_info})
    views

    总结,分页时需要做三件事:

    • 创建处理分页数据的类
    • 根据分页数据获取数据
    • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]

     

  • 相关阅读:
    单一职责原则
    23种设计模式
    微信小程序页面跳转
    【论文阅读】OrigamiNet:Weakly-Supervised, Segmentation-Free, One-Step, Full Page Text Recognition by learning to unfold
    【华为昇腾】DB_ResNet精度调优 Siammask性能调优 模型众筹项目复盘
    Ueditor 防止html过滤标签的操作
    海康摄像机rtsp地址格式官方最新版(2020)
    HLS协议解析
    解决帝国标题颜色颜色单引号问题
    帝国CMS动态页支持栏目导航标签,万能标签,循环子栏目标签
  • 原文地址:https://www.cnblogs.com/sun1994/p/8409535.html
Copyright © 2020-2023  润新知