ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django当中自己定义写一个分页器

2022-07-29 11:00:53  阅读:179  来源: 互联网

标签:count 定义 self Django current query pager page 分页


在python当中自己写一个分页器,而不是直接运用Django中的分页器组件。

1.py

  1 """
  2 分页组件
  3 """
  4 
  5 
  6 class Pagination(object):
  7     def __init__(self, current_page, all_count, base_url, query_params, per_page=20, pager_page_count=11):
  8         """
  9         分页初始化
 10         :param current_page: 当前页码
 11         :param per_page: 每页显示数据条数
 12         :param all_count: 数据库中总条数
 13         :param base_url: 基础URL
 14         :param query_params: QueryDict对象,内部含所有当前URL的原条件
 15         :param pager_page_count: 页面上最多显示的页码数量
 16         """
 17         self.base_url = base_url
 18         try:
 19             self.current_page = int(current_page)
 20             if self.current_page <= 0:
 21                 raise Exception()
 22         except Exception as e:
 23             self.current_page = 1
 24         self.query_params = query_params
 25         self.per_page = per_page
 26         self.all_count = all_count
 27         self.pager_page_count = pager_page_count
 28         pager_count, b = divmod(all_count, per_page)
 29         if b != 0:
 30             pager_count += 1
 31         self.pager_count = pager_count
 32 
 33         half_pager_page_count = int(pager_page_count / 2)
 34         self.half_pager_page_count = half_pager_page_count
 35 
 36     @property
 37     def start(self):
 38         """
 39         数据获取值起始索引
 40         :return:
 41         """
 42         return (self.current_page - 1) * self.per_page
 43 
 44     @property
 45     def end(self):
 46         """
 47         数据获取值结束索引
 48         :return:
 49         """
 50         return self.current_page * self.per_page
 51 
 52     def page_html(self):
 53         """
 54         生成HTML页码
 55         :return:
 56         """
 57         # 如果数据总页码pager_count<11 pager_page_count
 58         if self.pager_count < self.pager_page_count:
 59             pager_start = 1
 60             pager_end = self.pager_count
 61         else:
 62             # 数据页码已经超过11
 63             # 判断: 如果当前页 <= 5 half_pager_page_count
 64             if self.current_page <= self.half_pager_page_count:
 65                 pager_start = 1
 66                 pager_end = self.pager_page_count
 67             else:
 68                 # 如果: 当前页+5 > 总页码
 69                 if (self.current_page + self.half_pager_page_count) > self.pager_count:
 70                     pager_end = self.pager_count
 71                     pager_start = self.pager_count - self.pager_page_count + 1
 72                 else:
 73                     pager_start = self.current_page - self.half_pager_page_count
 74                     pager_end = self.current_page + self.half_pager_page_count
 75 
 76         page_list = []
 77 
 78         if self.current_page <= 1:
 79             prev = '<li><a href="#">上一页</a></li>'
 80         else:
 81             self.query_params['page'] = self.current_page - 1
 82             prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode())
 83         page_list.append(prev)
 84         for i in range(pager_start, pager_end + 1):
 85             self.query_params['page'] = i
 86             if self.current_page == i:
 87                 tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % (
 88                     self.base_url, self.query_params.urlencode(), i,)
 89             else:
 90                 tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,)
 91             page_list.append(tpl)
 92 
 93         if self.current_page >= self.pager_count:
 94             nex = '<li><a href="#">下一页</a></li>'
 95         else:
 96             self.query_params['page'] = self.current_page + 1
 97             nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
 98         page_list.append(nex)
 99         page_str = "".join(page_list)
100         return page_str

后端v1.py

 1 def changelist_view():
 2     data_list = self.UserInfo.objects.all()
 3     per_page_count = 10
 4     all_count = self.UserInfo.objects.all().count() # 计算该queryset当中对象总数
 5         query_params = request.GET.copy()  # 拷贝一份  去拿 page=1
 6         query_params._mutable = True    # 申明可以修改了
 7         pager = Pagination(
 8             current_page=request.GET.get('page'),    # page= 2 
 9             all_count=all_count,   
10             base_url=request.path_info,       # /stark/userinfo/list/
11             query_params =query_params,      
12             per_page=per_page_count,  #每页显示页数
13         )
14         data_list = data_list[pager.start:pager.end]        
15 
16     return render(request,'index.html',{  'pager':pager,})

前端index.html

    <div>
        <nav>
            <ul class="pagination">
                {{ pager.page_html|safe }}
            </ul>
        </nav>
    </div>

 

标签:count,定义,self,Django,current,query,pager,page,分页
来源: https://www.cnblogs.com/shaoyishi/p/16531546.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有