Esempio n. 1
0
    def getpage(self):
        paginator = Paginator(self.objectlist, self.num)
        currentPage = self.request.GET.get('page', 1)
        object_list = paginator.get_page(
            currentPage)  # Django 2.0下新增了get_page()方法

        page_range = []
        current = object_list.number  # 当前页码
        page_all = paginator.num_pages  # 总页数
        mid_pages = 3  # 中间段显示的页码数
        page_go = 1  # 默认跳转的页码

        # 获取优化显示的页码列表
        if page_all <= 2 + mid_pages:
            # 页码数少于6页就无需分析哪些地方需要隐藏
            page_range = paginator.page_range
        else:
            # 添加应该显示的页码
            page_range += [1, page_all]
            page_range += [current - 1, current, current + 1]

            # 若当前页是头尾,范围拓展多1页
            if current == 1 or current == page_all:
                page_range += [current + 2, current - 2]

            # 去掉超出范围的页码
            page_range = filter(lambda x: x >= 1 and x <= page_all, page_range)

            # 排序去重
            page_range = sorted(list(set(page_range)))

            # 查漏补缺
            # 从第2个开始遍历,查看页码间隔,若间隔为0则是连续的
            # 若间隔为1则补上页码;间隔超过1,则补上省略号
            t = 1
            for i in range(len(page_range) - 1):
                step = page_range[t] - page_range[t - 1]
                if step >= 2:
                    if step == 2:
                        page_range.insert(t, page_range[t] - 1)  # 补页码
                    else:
                        page_go = page_range[t - 1] + 1
                        page_range.insert(t, '...')
                    t += 1
                t += 1

        # 优化结果之后的页码列表
        paginator.page_range_ex = page_range
        # 默认跳转页的值
        paginator.page_go = page_go

        return paginator, object_list