• 分页器


    分页器

      """
      django中有自己的分页器模块,但是书写起来很麻烦并且功能太简单
      所以我们自己用自己写好的分页器
      """
    
      class Pagination(object):
          def __init__(self,current_page,all_count,per_page_num=2,pager_count=11):
              """
              封装分页相关数据
              :param current_page: 当前页
              :param all_count:    数据库中的数据总条数
              :param per_page_num: 每页显示的数据条数
              :param pager_count:  最多显示的页码个数
        
              用法:
              queryset = model.objects.all()
              page_obj = Pagination(current_page,all_count)
              page_data = queryset[page_obj.start:page_obj.end]
              获取数据用page_data而不再使用原始的queryset
              获取前端分页样式用page_obj.page_html
              """
              try:
                  current_page = int(current_page)
              except Exception as e:
                  current_page = 1
    
              if current_page <1:
                  current_page = 1
    
              self.current_page = current_page
    
              self.all_count = all_count
              self.per_page_num = per_page_num
    
    
              # 总页码
              all_pager, tmp = divmod(all_count, per_page_num)
              if tmp:
                  all_pager += 1
              self.all_pager = all_pager
    
              self.pager_count = pager_count
              self.pager_count_half = int((pager_count - 1) / 2)
    
          @property
          def start(self):
              return (self.current_page - 1) * self.per_page_num
    
          @property
          def end(self):
              return self.current_page * self.per_page_num
    
          def page_html(self):
              # 如果总页码 < 11个:
              if self.all_pager <= self.pager_count:
                  pager_start = 1
                  pager_end = self.all_pager + 1
              # 总页码  > 11
              else:
                  # 当前页如果<=页面上最多显示11/2个页码
                  if self.current_page <= self.pager_count_half:
                      pager_start = 1
                      pager_end = self.pager_count + 1
    
                  # 当前页大于5
                  else:
                      # 页码翻到最后
                      if (self.current_page + self.pager_count_half) > self.all_pager:
                          pager_end = self.all_pager + 1
                          pager_start = self.all_pager - self.pager_count + 1
                      else:
                          pager_start = self.current_page - self.pager_count_half
                          pager_end = self.current_page + self.pager_count_half + 1
    
              page_html_list = []
              # 添加前面的nav和ul标签
              page_html_list.append('''
                          <nav aria-label='Page navigation>'
                          <ul class='pagination'>
                      ''')
              first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
              page_html_list.append(first_page)
    
              if self.current_page <= 1:
                  prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
              else:
                  prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)
    
              page_html_list.append(prev_page)
    
              for i in range(pager_start, pager_end):
                  if i == self.current_page:
                      temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
                  else:
                      temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
                  page_html_list.append(temp)
    
              if self.current_page >= self.all_pager:
                  next_page = '<li class="disabled"><a href="#">下一页</a></li>'
              else:
                  next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
              page_html_list.append(next_page)
    
              last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
              page_html_list.append(last_page)
              # 尾部添加标签
              page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
              return ''.join(page_html_list)
    

    使用

      """
      当我们需要使用到非django内置的第三方功能或者组件代码的时候
      我们一般情况下会创建一个名为utils的文件夹,在该文件夹内对模块进行功能性划分
    
      我们到了后期封装代码的时候,不再局限于函数
      而是尽量朝面向对象封装
      """
      from utils.mypage import Pagination
      page_obj = Pagination(current_page,all_count) # 生成分页对象
      page_queryset = book_queryset[page_obj.start:page_obj.end] # 对数据切片
    
      # 前端
      利用自定义分页器直接显示分页器样式
      {{ page_obj.page_html|safe }}
  • 相关阅读:
    iOS设计模式-工厂方法
    iOS设计模式-原型模式
    (转)iOS 屏幕适配
    iOS设计模式-MVC
    转 常用第三方库
    学习资料收集
    xcode 插件
    CocoaPods安装和使用
    iOS 友盟统计的bug分析
    HTML——表格
  • 原文地址:https://www.cnblogs.com/qijiaxun/p/14258221.html
Copyright © 2020-2023  润新知