Python自定义分页插件,其他语言逻辑相同

分页器包含基础的上一页、下一页、首页、尾页等。

分页器代码
"""
---------
分页器插件
---------
"""

# css class名 ↓ ↓
# PreviousPage 上一页
# NextPage 下一页
# EndPage尾页
# StartPage 首页
# ItemPage 每一页
# ActivePage 选中页
class Pagination:
    def __init__(self,totalNums,pageUrl,nowPage,perPage=10,perDisPage=11,
                 pageUp=True,pageNext=True,startPage=True,endPage=True,hidePageUp=False,hidePageNext=False,perTotol=True):
        """
        通过类方法获得当前页数起始数据索引,结束数据索引,对总数据进行切片,得到当前页的内容

        自定制分页插件,修改样式通过修改css class名设置不同的样式,可使用JavaScript技术修改页码显示内容,及添加类名。

        css class名:↓ ↓
            PreviousPage 上一页
            NextPage 下一页
            EndPage尾页
            StartPage 首页
            ItemPage 每一页
            ActivePage 选中页
            PerTotolPage 单页/总页
            PageList 包装每页的盒子
            NoActive 首页或尾页 不能点的样式

        :param totalNums: 总数据量          无默认
        :param nowPage:当前页              无默认
        :param pageUrl: 每页跳转地址          无默认
        :param perPage: 每页显示的数据量        默认10
        :param perDisPage: 显示的页数        默认11
        :param pageUp:是否有上一页            默认True
        :param pageNext:是否有下一页            默认True
        :param startPage:是否显示开始页         默认True
        :param endPage:是否显示结束页           默认True
        :param hidePageUp:首页是否隐藏上一页     默认False
        :param hidePageNext:尾页是否隐藏下一页   默认False
        :param perTotol:是否显示 单页/总页(1/4  默认True

        """
        self.__total_nums = totalNums
        self.__per_page = perPage
        self.__page_url = pageUrl
        self.__per_dis_page = perDisPage
        self.__page_up = pageUp
        self.__page_next = pageNext
        self.__start_page = startPage
        self.__end_page = endPage
        self.__hid_page_up = hidePageUp
        self.__hid_page_next = hidePageNext
        self.__per_totol = perTotol
        a,b = divmod(self.__total_nums,self.__per_dis_page)     # 求余数和商
        if b == 0:
            self.all_page = a   # 如果没有余数,总页数为商
        else:
            self.all_page = a + 1   # 如果有余数 总页数为商+1

        try:
            self.__now_page = int(nowPage)    # 当前页 转换为 数字
            if self.__now_page < 0:   # 如果 页码成为负数,取其绝对值
                self.__now_page = abs(self.__now_page)
            elif self.__now_page == 0:    # 如果当前页码为0 为第1页
                self.__now_page = 1
            elif self.__now_page > self.all_page:     # 如果页码超过的最大页数 将页码设置 最大页码
                self.__now_page = self.all_page
        except Exception:
            self.now_page = 1   # 输入非数字的 都为第1页

    @property
    def startPage(self):
        """
        获得页码范围的起始值
        :return: 起始页码
        """
        if self.__now_page >= self.all_page - int(self.__per_dis_page / 2):
            return self.all_page-(self.__per_dis_page+1)
        if self.__now_page <= int(self.__per_dis_page/2):
            return 1
        return self.__now_page-int(self.__per_dis_page/2)

    @property
    def endPage(self):
        """
        获得页码范围的最后值
        :return:结束页码
        """
        if self.__now_page <= int(self.__per_dis_page/2):
            return self.__per_dis_page+1
        if self.__now_page >= self.all_page-int(self.__per_dis_page/2):
            return self.all_page
        return self.__now_page+int(self.__per_dis_page/2)

    @property
    def Html(self):
        page_lable = []
        page_lable.append("<ul class='PageList' style='display:flex'>")     # ul盒子开始
        # 首页设置
        if self.__start_page: # 如果有首页
            page_lable.append("<li><a class='StartPage' href='/%s?page=1'>首页</a></li>"% self.__page_url)

        # 上一页设置
        if self.__page_up:  # 如果有上一页
            if self.__now_page == 1 :
                if not self.__hid_page_up:  # 如果不隐藏
                    page_lable.append("<li><a class='PreviousPage NoActive' href='#'>上一页</a></li>")     # 如果在第一页 让首页点不动
            else:
                page_lable.append("<li><a class='PreviousPage' href='/%s?page=%s'>上一页</a></li>" % (
                    self.__page_url, self.__now_page - 1))

        # 每个页码
        for page_num in range(self.startPage, self.endPage+1):
            if page_num == self.__now_page:     # 选中页的不同class
                temp_lable = "<li><a class='ItemPage ActivePage' href='/%s?page=%s'>%s</a></li>"%(self.__page_url, page_num,page_num)
            else:
                temp_lable = "<li><a class='ItemPage' href='/%s?page=%s'>%s</a></li>"%(self.__page_url, page_num, page_num)
            page_lable.append(temp_lable)   # 将每个标签填入 标签列表


        if self.__per_totol:
            page_lable.append("<span class='PerTotolPage'>%s/%s</span>"%(self.__now_page,self.all_page))
        # 设置下一页
        if self.__page_next:
            if self.__now_page == self.all_page :
                if not self.__hid_page_next:  # 如果不隐藏
                    page_lable.append("<li><a class='NextPage NoActive' href='#'>下一页</a></li>")     # 如果在最后页 让尾页点不动
            else:
                page_lable.append(
                    "<li><a class='NextPage' href='/%s?page=%s'>下一页</a></li>" % (self.__page_url, self.__now_page + 1))


        # 尾页设置
        if self.__end_page: # 如果有尾页
            page_lable.append("<li><a class='EndPage' href='/%s?page=%s'>尾页</a></li>"% (self.__page_url,self.all_page))

        page_lable.append("</ul>") # ul盒子结束

        return "\n".join(page_lable)
views代码(基于Django)
page = request.GET.get("page",1) # 获得当前页
    lis = [] # 总数据,
    for i in range(0,500):
        lis.append("测试分页%s----------%s"%(i,i)) # 添加测试数据

    from MyDjango.pagination import Pagination


    test = Pagination(len(lis),"use_space",page,perPage=2) # 创建分页
    data = lis[test.startPage:test.endPage:] # 对数据切片
Html代码(基于Django)

非常简洁

{% for i in data %}
  <p>{{ i }}</p>
{% endfor %}
{{ test.Html|safe }}