Django笔记--自制分页

本文介绍如何在Django中自制分页功能,利用pageInfo类进行封装,并通过配置路由、编写视图函数和HTML模板渲染实现。通过示例展示在插入300条数据后,分页组件的实用性和易用性。
摘要由CSDN通过智能技术生成

Django笔记–自制分页


前言

接着上一篇的基础,做一个分页,前端界面采用bootstrap插件。

一、封装pageInfo类

把分页的功能封装在pageInfo类中,做成一个组件,不论在任何地方直接导入都是可以用的:


class pageInfo(object):
    def __init__(self,current_page,all_count,per_page,show_page,currrnt_url):
        """

        :param current_page: 当前访问的页码
        :param all_count: 数据库数据总条数
        :param per_page: 每一页显示几条数据
        :param show_page: 显示的页码个数,--可以自己设置,但是一定要设置不小于3奇数,
        如show_page=11,显示当前页前5条和后5条,一共11条页码,
        :param currrnt_url:展示数据页面的URL
        """
        try:
            self.current_page = int(current_page)
        except Exception as  e:
            self.current_page = 1

        self.per_page = per_page

        #计算总页数
        a,b = divmod(all_count,per_page)
        if b:
            a = a + 1
        self.all_page = a
        self.show_page = show_page

        #接收URL
        self.currrnt_url = currrnt_url

    def start(self):
        #每一页要显示数据的起始位置
        return (self.current_page-1) * self.per_page

    def end(self):
        #每一页要显示数据的结束位置
        return self.current_page * self.per_page

    def pager(self):
        if self.current_page < self.show_page:
            #如果当前页小于显示的页数,那么一直让分页显示,第一页到---self.show_page
            star = 1
            end = self.show_page + 1
        elif self.current_page > self.all_page - self.show_page + 1:
            #如果当前页大于总页数减去10(self.all_page-10),那么让分页显示:self.all_page-10----self.all_page(总页数)
            star = self.all_page - self.show_page + 1
            end = self.all_page + 1
        else:
            #除以上两种情况,分页都显示当前页前5页,后5页
            half = int((self.show_page - 1)/2)
            star = int(self.current_page - half)
            end = int(self.current_page + half +1)

        #上一页
        if self.current_page <= 1:
            up = " <li ><a href='#'>&raquo;</a></li>"
        else:
            up = " <li ><a href='%s?page=%s'>&laquo;</a></li>"%(self.currrnt_url,self.current_page-1,)
        page_list = []
        page_list.append(up)

        #分页
        for i in range(star,end):
            if i == self.current_page:
                temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>"%(self.currrnt_url,i,i,)
            else:
                temp = "<li ><a href='%s?page=%s'>%s</a></li>" % (self.currrnt_url,i, i,)
            page_list.append(temp)

        #下一页
        if self.current_page >= self.all_page:
           nt = " <li ><a href='#'>&laquo;</a></li>"
        else:
            nt = " <li ><a href='%s?page=%s'>&raquo;</a></li>" % (self.currrnt_url,self.current_page + 1,)

        page_list.append(nt)

        return ''.join(page_list)

二、使用步骤

1.配置路由

urlpatterns = [
    url(r'^custom/', views.custom),#自制分页
]

2.编写视图函数

def custom(request):
    # current_page = request.GET.get('page')#当前要访问的页码
    # current_page = int(current_page)
    all_count = models.UserIfo.objects.all().count()
    page_info = pageInfo(request.GET.get('page'),all_count,15,11,'/custom/')

    user_list = models.UserIfo.objects.all()[page_info.start():page_info.end()]

    return render(request,'custom.html',{'user_list':user_list,'page_info': page_info})

3.HTML模板渲染

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>USER表</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <h3>USER列表</h3>
    <table class="table table-striped table-bordered table-hover">
        <thead>
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
            <th>ut.title</th>
        </tr>
        </thead>
        <tbody>

            {% for row in user_list %}
                 <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.name }}</td>
                <td>{{ row.age}}</td>
                <td>{{ row.ut.title}}</td>
                 </tr>
            {% endfor %}

        </tbody>
    </table>


    <ul class="pagination">


          {{ page_info.pager|safe }}

    </ul>
</body>
</html>

此时数据库中数据较少,显示不出效果,先插入300条数据看看效果:

for i in range(300):
      name = "帅男" + str(i)
      models.UserIfo.objects.create(name=name,age=18,ut_id=2)

大功告成:
在这里插入图片描述


总结

有了这样一个组件还是非常方便的,直接引用传入自己的参数即可:

page_info = pageInfo(request.GET.get('page'),all_count,15,11,'/custom/')
参数说明:

以上每一处都有详细注释,就不做过多总结了,再说一下参数说明
第1个参数:通过get传参获取当前的页码
第2个参数:数据总条数
第3个参数:每一页显示的数据条数
第4个参数:显示页码个数
第5个:URL

nice!!!!奥利给

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值