分享一个自定义的Python分页组件

先看效果:

在这里插入图片描述

附上源码:

"""
自定义分页
传入:
-所有数据的个数
-当前页
-每页显示30条
-最多页面7个
"""


class Pagination():
    def __init__(self, totalCount, currentPage, Url, perPagItemNum=5, maxPagNum=7,):
        # 数据总总条数,当前页,跳转的url,每页显示条数,最多显示页码
        self.Url=Url
        self.totalCount = totalCount
        try:
            v = int(currentPage)
            if v <= 0:
                v = 1
                self.currentPage = v
        except Exception as e:
            self.currentPage = 1
        self.perPagItemNum = perPagItemNum
        self.maxPagNum = maxPagNum
        self.currentPage = currentPage

    def Start(self):
        return (self.currentPage - 1) * self.perPagItemNum

    def End(self):
        return self.currentPage * self.perPagItemNum

    @property
    def TotalPage(self):  # 总页数
        result = divmod(self.totalCount, self.perPagItemNum)
        if result[1] == 0:
            return result[0]
        else:
            return result[0] + 1

    def page_num_range(self):
        # 当前页面
        # self.current_page
        # 总页数
        # self.num_pages
        # 最多显示的页码个数
        # self.max_pager_num
        if self.TotalPage < self.maxPagNum:
            return range(1, self.TotalPage + 1)
        part = int(self.maxPagNum / 2)
        if self.currentPage - part < 1:
            return range(1, self.maxPagNum + 1)
        if self.currentPage + part > self.TotalPage:
            return range(self.TotalPage + 1 - self.maxPagNum, self.TotalPage + 1)
        return range(self.currentPage - part, self.currentPage + part + 1)

    def page_str(self):
        page_list = []
        first="<li><a href='"+self.Url+"?p=1'>首页</a></li>"
        page_list.append(first)
        if self.currentPage == 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='"+self.Url+"?p=%s'>上一页</a></li>" % (self.currentPage - 1,)
        page_list.append(prev)
        for i in self.page_num_range():
            if i==self.currentPage:
                temp = "<li class= 'active'><a href='"+self.Url+"?p=%s'>%s</a></li>" % (i, i)
            else:
                temp = "<li ><a href='"+self.Url+"?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)
        if self.currentPage==self.TotalPage:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex="<li><a href='"+self.Url+"?p=%s'>下一页</a></li>"%(self.currentPage+1,)
        page_list.append(nex)
        last = "<li><a href='"+self.Url+"?p=%s'>尾页</a></li>"%(self.TotalPage)
        page_list.append(last)

        return ''.join(page_list)

源码解析:

用的话需要五个参数:

totalCount, currentPage, Url, perPagItemNum=10, maxPagNum=7

分别对应:

数据总总条数,当前页,要跳转的url,每页显示条数,最多显示页码

后两个参数有默认值,所以三个就够

eg:page_obj=Pagination(200,current_page,"/student_manage")    这是下面的函数部分里的

url对应的函数部分:

L = []
for i in range(200):
    L.append(i)
def index2(request):
    from app01.pager import Pagination   
    #我这里将组件部分单独放在了一个PY文件里,所以需要导入,写在一起的话就不需要了
    try:
        current_page = int(request.GET.get("p"))
    except Exception:
        current_page=1
   #获取当前页,第一次的话呈现首页  
    page_obj=Pagination(200,current_page,"/student_manage")
    #使用组件
    data_list=L[int(page_obj.Start()):int(page_obj.End())]
    #获取这一页的数据内容
    return render(request,"index2.html",{"data":data_list,"page_obj":page_obj})

函数部分讲解:
这里为了简便,我用一个L列表代替下数据库来呈现效果,用数据库也是一样的

HTML部分:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<ul>
    {% for item in data %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
{#数据部分#}
<ul class="pagination pagination-sm">
        {{ page_obj.page_str | safe }}
      </ul>
{#分页部分,呈现的就是上面的效果#}
</body>
</html>

注:这里用了bootstrap里的一个css组件,只需要下载导入即可

再加一张效果图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值