django自定制分页器

自定制一个分页类

class Pagination:
    def __init__(self, request, current_page, all_data, per_page_num=None, max_page_count=11):
        per_page_num = per_page_num or 2
        try:
            current_page = int(current_page)
        except TypeError:
            # except Exception as e:
            current_page = 1

        if current_page < 1:
            current_page = 1

        self.current_page = current_page  # 翻页页码
        self.all_count = len(all_data)  # 所有数据长度
        self.per_page_num = per_page_num    # 每页数据条数

        # 总页码  divmod返回商和余数, all_pager 除数 tmp余数
        all_pager, tmp = divmod(self.all_count, per_page_num)

        if tmp:
            all_pager += 1

        self.all_pager = all_pager  # 数据总页数
        self.max_page_count = max_page_count  # 最大分页书
        self.max_page_count_half = int((max_page_count - 1) / 2)  # 最大分页数的一半

        self.request = request
        import copy
        # 拷贝request中get请求的数据 为下面保存url状态做铺垫
        self.params = copy.deepcopy(self.request.GET)
    '''
     all_count=100    per_page_num =10 

     current_page        start    end
          1                 0      10
          2                 10     20
          3                 20     30


      all_count=100    per_page_num =8

     current_page        start    end
          1                 0      8
          2                 8      16
          3                 16     24  

     表达式:    start= (current_page-1)*per_page_num    end =current_page* per_page_num

    '''

    @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.max_page_count:
            # 显示第一页到最大分页数
            if self.current_page <= self.max_page_count_half:
                page_range = range(1, self.max_page_count+1)

            # 显示 末页-最大分页数 到 末页
            elif(self.current_page+self.max_page_count_half) > self.all_pager:
                page_range = range(self.all_pager-self.max_page_count+1, self.all_pager+1)
            # 显示 翻页数前max_page_count_half 和后 max_page_count_half 页
            else:
                page_range = range(self.current_page-self.max_page_count_half,
                                   self.current_page+self.max_page_count_half+1)
        else:
            # 显示第一页到最后一页
            page_range = range(1, self.all_pager + 1)

        # print(page_range)

        # 构建分页页面的html
        page_html_list = []
        self.params['page'] = 1
        first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (
            self.params.urlencode(),)
        page_html_list.append(first_page)

        self.params["page"] = self.current_page - 1
        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),)

        page_html_list.append(prev_page)

        for i in page_range:
            self.params['page'] = i
            if i == self.current_page:
                temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
            else:
                temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
            page_html_list.append(temp)

        self.params["page"] = self.current_page + 1
        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),)
        page_html_list.append(next_page)

        self.params["page"] = self.all_pager
        last_page = '<li><a href="?%s">尾页</a></li> </ul></nav>' % (self.params.urlencode())
        page_html_list.append(last_page)

        return ''.join(page_html_list)

 

posted @ 2019-04-17 21:57  平平无奇小辣鸡  阅读(100)  评论(0)    收藏  举报