python django 之 django自定制分页

  1. 自定制的分页模块
    #!/usr/bin/env python3
    
    # V1.1 解决问题:
    #   1). p 参数 为 负数 与 p 参数查过总页数时报错的问题
    
    # V1.2 解决的问题:
    #   1). 点击分页无法, get 其他参数的问题
    
    
    class  PageInfo(object):
        def __init__(self, current_page,per_page_num, all_count, base_url, get_url='' , page_range=9):
            """
            :param current_page: 当前页
            :param per_page_num: 每页显示的数据的条数
            :param all_count: 数据总条数
            :param base_url: 请求路径
            :param page_range: 显示页数, 标准网页页码数
            :param get_url : 用户除 p 参数之外提交的其他 get 参数, 用来拼接 url
            """
            try:
                current_page = int(current_page)
            except Exception as e:
                current_page = int(1)
            self.current_page = current_page
            self.per_page_num = per_page_num
            # 数据总条数 / 每页页数  如果 余数为 0 商就就是页数, 如果非零  页数就是 商 + 1
            quotient, remainder = divmod(all_count, per_page_num)
            if remainder != 0:
                self.all_page = quotient + 1   # all_page 总页数
            else:
                self.all_page = quotient
            self.base_url = base_url
            self.page_range = page_range
            self.get_url = get_url
            # 限制当前页的 范围
            if current_page < 1:
                self.current_page = 1
            elif current_page >self.all_page:
                self.current_page = self.all_page
    
        def start(self):
            return (self.current_page - 1) * self.per_page_num
    
        def end(self):
            return self.current_page * self.per_page_num
    
        def page_str(self):
            '''在 HTML 页面中显示页码信息'''
            page_list = []
    
            # 首页
            home_page = '<li><a href="%s?p=1%s">首页</a></li>'%(self.base_url, self.get_url)
            page_list.append(home_page)
            # 限制 上一页
            if self.current_page <=1:
                previous = '<li><a href="">上一页</a></li>'
            else:
                previous = '<li><a href="%s?p=%s%s">上一页</a></li>' %(self.base_url,self.current_page-1, self.get_url)
            page_list.append(previous)
    
    
            # 整个 大 if 的作用 : 使用 start 与 end 类限制页码的个数
            if self.all_page <= self.page_range:
                # 此 if 的 作用 : 当页码总数 <= 最大页码显示的个数, 时触发
                start = 1
                end = self.all_page
            else:
                if self.current_page > int(self.page_range/2):
                    if self.current_page >= self.all_page-int(self.page_range/2):
                        # 此 if 循环 : 当前页码 >= 最大页码-标准页码/2 时触发, 不然就会出现没有数据的假页码,
                        # 比如最大页码, 113 此时就会出现 114 , 114 就是假页码
                        start = self.all_page - self.page_range + 1 # 如果不加 1 页码数, 开始的页码就会是 标准页码多一个
                            # 这个时候开始生成为就应该是, 最大页码 - 标准页码 + 1 = 这时页面上的页码才是 标准页码个数
                        end = self.all_page + 1 # 最后一只能是 最大页码
                    else:
                        start = self.current_page - int(self.page_range/2)
                        end = self.current_page + int(self.page_range/2)+1
                else:
                    # 处理 首页的几页页
                    start = 1 # 说明页码的开头必须是 1
                    end = self.page_range +1 #
    
            # for i in range(1, self.all_page+1):
            for i in range(start, end):
                # for 的作用: 循环生成页码, 而页码的个数是在 self.page_range 中指定
                # start 与 end 是为了限制页码的个数
    
                # if 判断的 用途 , 为了实现, 只有在中间的 页码 才有  class="active" 属性
                if self.current_page == i:
                    temp = '<li class="active"><a href="%s?p=%s%s">%s</a></li>'%(self.base_url, i, self.get_url, i)
                else:
                    temp = '<li><a href="%s?p=%s%s">%s</a></li>' % (self.base_url, i, self.get_url, i)
                page_list.append(temp)
    
            # 限制 下一页
            if self.current_page >= self.all_page:
                next_page = '<li><a href="">下一页</a></li>'
            else:
                next_page = '<li><a href="%s?p=%s%s">下一页</a></li>' %(self.base_url,self.current_page+1, self.get_url)
            # 添加进列表
            page_list.append(next_page)
    
    
            # 尾页
            home_page = '<li><a href="%s?p=%s%s">尾页</a></li>'%(self.base_url, self.all_page, self.get_url)
            page_list.append(home_page)
            return ''.join(page_list)
    

     

  2. 调用的视图函数 (视图文件)
    def data_count(request):
        all_count = models.District.objects.count()
        from .page_info import PageInfo
        base_url = request.path_info
        page_info = PageInfo(request.GET.get('p'), 10, all_count, base_url)
        user_list = models.District.objects.filter(id__range=[page_info.start(),page_info.end()])
        return render(request, 'users2.html',{'user_list':user_list})
    

     

  3. template 文件
    <body>
        <div style="width: 800px; margin: 0 auto">
            <h1>用户列表</h1>
            <table class="table table-hover table-bordered">
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>邮箱</th>
                </tr>
                {% for i in user_list %}
                <tr>
                    <td>{{ i.id }}</td>
                    <td>{{ i.name }}</td>
                    <td>{{ i.password }}</td>
                    <td>{{ i.email }}</td>
                </tr>
                {% endfor %}
            </table>
            <div>
                <nav aria-label="...">
                    <ul class="pagination">
                        {# 分页页码 #}
                        {{ page_info.page_str|safe }}
                    </ul>
                </nav>
            </div>
        </div>
    </body>
    

     

     

     

转载于:https://www.cnblogs.com/dream4567/p/8799717.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值