Django-自定义分页组件

1.封装的分页代码:

class PageInfo(object):
    def __init__(self,current_page,all_count,per_page,base_url,show_page=7):
        '''

        :param current_page: 当前页面
        :param all_count: 总行数
        :param per_page: 每页显示的行数
        :param base_url: 要跳转的url
        :param shpw_page: 显示多少个页面,默认为7
        '''
        try:
            #当前页面
            self.current_page = int(current_page)
        except Exception as e:
            #出错就让当前页=1
            self.current_page =1

        #每页显示的行数
        self.per_page = per_page

        #内置函数,总行数,每页的行数= 整数,余数
        a,b = divmod(all_count,per_page)

        #b:余数。如果是有数即True
        if b:
            #有余数就在总页数上+1
            a +=1
        #总页数
        self.all_pager = a
        #显示的页码数
        self.show_page = show_page

        #跳转的url,可以供不同的功能,如:学生管理,老师管理.....等
        self.base_url = base_url
    #起始函数
    def start(self):
        #(当前页 - 1) * 每页行数
        return (self.current_page - 1) * self.per_page

    #结束函数
    def end(self):
        #当前页*页面行数
        return self.current_page * self.per_page


    def pager(self):
        #存放页码
        page_list = []

        #当前页面中显示的页码-1/2,左右显示的数量
        half = int((self.show_page-1)/2)

        #如果数据总页数<7
        if self.all_pager < self.show_page:
            #重新设定起始值和结束值
            begin = 1
            stop = self.all_pager +1
        # 如果数据总页数>7
        else:
            #如果当前页 <= 3 ,永远显示1,7
            if self.current_page  <= half:
                begin = 1
                stop = self.show_page + 1
            else:
                #当前页 + 3 > 总页数
                if self.current_page + half > self.all_pager:
                    #总页数 - 显示的页数 + 1
                    begin = self.all_pager - self.show_page + 1
                    #总页数 + 1
                    stop = self.all_pager + 1
                # 当前页 + 3 < 总页数
                else:
                    #当前页码 - 3
                    begin = self.current_page - half
                    #当前页码 + 3 + 1
                    stop = self.current_page + half + 1
        #当前页码<=1,就让当前的上一页刷新当前页面
        if self.current_page <= 1:
            # prev = '<li><a href="#">上一页</a></li>'
            #如果是1,就让上一页消失
             prev = ''
        #当前页码>1,就让当前的上一页加1,持续进行分页操作
        else:
            prev = '<li><a href="%s?page=%s">上一页</a></li>'%(self.base_url,self.current_page-1,)
        #将页码存入到list中
        page_list.append(prev)

        #遍历页码,起始值————结束值
        for i in range(begin,stop):
            #i == 当前的页码
            if i == self.current_page:
                #就给当前的页码添加一个样式,以便区分当前选中的页码是多少
                temp = '<li class="active" ><a href="%s?page=%s">%s</a></li>'%(self.base_url,i,i,)
            # i != 当前的页码
            else:
                #就不管
                temp = '<li><a href="%s?page=%s">%s</a></li>'%(self.base_url,i,i,)
            page_list.append(temp)
        #当前页大于总页数
        if self.current_page >= self.all_pager:
            # nex = '<li><a href="#">下一页</a></li>'
            nex = ''
        # 当前页小于总页数
        else:
            #每点击下一页进行加1
            nex = '<li><a href="%s?page=%s">下一页</a></li>'%(self.base_url,self.current_page + 1,)
        #添加到list中
        page_list.append(nex)
        #字符串拼接
        return ''.join(page_list)

2.调用分页的函数:views.py中

#运行的函数
def custom(request):
    #总行数
    all_count = models.UserInfo.objects.all().count()

    #调用分页的class,并实例化对象。当前页码|总页码数|每页显示的行数|跳转的url
    page_info = PageInfo(request.GET.get('page'),all_count,10,'/custom.html')
    #拿到我所有的数据
    user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]

    return render(request,'custom.html',locals())

3.路由系统:urls.py

url(r'^custom.html$', views.custom),

4.html中的代码 :使用了bootstrap中的分页组件样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css" />
</head>
<body>
    <h1>用户表</h1>
    <ul>
        {% for row in user_list %}
            <li>{{ row.name }}|{{ row.age }}|{{ row.ug.title }}</li>
        {% endfor %}

    </ul>
{#    使用的bootstrap中的组件#}
<nav aria-label="Page navigation">
  <ul class="pagination">
{#      page_info.pager|safe:显示我定义好的pager函数,并且使用模板中的safe方法,让在后端写的标签生效,不写safe,那么前端页面原样输出我写的标签#}
    {{ page_info.pager|safe }}
  </ul>
</nav>
</body>
</html>
原文地址:https://www.cnblogs.com/bingabcd/p/7275682.html