Python分页

# -*-coding:utf-8-*-
# Author:Ds
from django.utils.safestring import mark_safe
from django.http.request import QueryDict

class Pagetions:

    def __init__(self, curPage, all_data, params=None, page_nums=10, max_show=9):
        '''
        :param curPage:   # 当前页数
        :param all_data:  # 数据总量
        :param page_nums:  # 每页多少条
        :param max_show:  # 显示总共几页
        '''


        ### 保留分页的条件信息
        # 需要 拼接参数, 使用QueryDict 的urlencode方法,将参数 拼接, 并转码
        if not params:
            params=QueryDict(mutable=True) # 能够修改 QueryDict
        self.params=params
        # 1. 给self对象附上属性
        try:
            # 处理传递的当前页.  转换类型数值型
            curPage = int(curPage)
            if curPage < 0:
                curPage = 1
        except Exception:
            curPage = 1

        self.curPage = curPage  # 当前页
        self.all_data = all_data  # 总数据量

        # 2. 分页计算
        #  计算总页数
        total_num, more = divmod(all_data, page_nums)  # 总数据量  每页显示几条

        if more:  # 当数据不能显示完一页,多余几条, 必须个增加一页去进行显示
            total_num += 1

        # 3. 最大显示的页码数的一边,用于固定页码的数量
        half_show = max_show // 2

        # 4. 分页边界判断
        if total_num <= max_show:
            ### 总页数不超过 最大页码数
            page_start = 1  # 起始页
            page_end = total_num  # 终止页
        else:
            ### 总页数超过最大页码数
            ## 左极值
            if self.curPage - half_show <= 0:  # 当前页  小于 最大显示的页数
                page_start = 1  # 起始页
                page_end = max_show  # 终止页  一页显示的总页数

                ## 右极值
            elif self.curPage + half_show > total_num:  # 当前页的页数 大于 最大显示的页数
                page_start = total_num - max_show + 1  # +1  总页数-一屏幕显示几页+1
                page_end = total_num  # #  总页数

            else:
                ## 正常
                # 页码的起始位置
                page_start = self.curPage - half_show  # 起始位置 = 当前页 -最大显示的页码数
                # 页码的终止位置
                page_end = self.curPage + half_show  # 结束位置 = 当前页 +最大显示的页码数

        self.page_start = page_start
        self.page_end = page_end
        self.total_num = total_num

        ### 切片显示数据
        self.start = (self.curPage - 1) * page_nums
        self.end = self.curPage * page_nums


    def page_html(self):
        '''
        ## 此方法用于生成 前一页 和 后一页
        :return:
        '''
        # 存放生成的html字符串
        li_list = []

        if self.curPage == 1:
            # 第一页
            li_list.append(
                '<li class="disabled"><a aria-label="Previous"> <span aria-hidden="true">&laquo;</span></a></li>'
            )
        else:
            self.params['page']=self.curPage-1  #
            li_list.append(
                f'<li><a href="?{self.params.urlencode()}" aria-label="Previous"> <span aria-hidden="true">&laquo;</span></a></li>'
            )

        for el in range(self.page_start, self.page_end + 1):
            self.params['page']=el
            if el == self.curPage:
                li_list.append('<li class="active"><a href="?{}">{}</a></li>'.format(self.params.urlencode(), el))
            else:
                li_list.append('<li><a href="?{}">{}</a></li>'.format(self.params.urlencode(), el))

        if self.curPage <= self.total_num:
            # 右极值
            li_list.append(
                '<li class="disabled"><a aria-label="Previous"> <span aria-hidden="true">&raquo;</span></a></li>'
            )
        else:
            self.params['page']=self.curPage+1

            li_list.append(
                '<li><a href="?{}" aria-label="Previous"> <span aria-hidden="true">&raquo;</span></a></li>'.format(self.params.urlencode())
            )

        return mark_safe(''.join(li_list))

猜你喜欢

转载自www.cnblogs.com/dengl/p/11990561.html