django分页

django实现分页的两种形式

一、django内置方法实现分页

django自带的分页不能设置样式

def domen(request):

    # for i in range(101):
    #     models.DataInfo.objects.create(name="root_%s"%i,phone=11111)

#获取url中cur_page的参数
    cur_page=request.GET.get('cur_page')
    cur_page=int(cur_page)
    data_list=models.DataInfo.objects.all()
    from django.core.paginator import Paginator

    paginatos=Paginator(data_list,10)

    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    
    # res=paginatos.count
    # res=paginatos.num_pages
    # res=paginatos.page_range
    # res=paginatos.page(2).number


    users=paginatos.page(cur_page)

    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    # paginator             paginator对象

    return render(request,'domen.html',{"users":users})
<div class="box">

    <ul>
        {% for user in users %}
            <li>
            {{ user.name }}
        {% endfor %}
        </li>
    </ul>
{#获取上一页#}
{% if users.has_previous %}
    <a href="/domen/?cur_page={{ users.previous_page_number }}">上一页</a>
{% endif %}

{#获取页码#}
{% for num in users.paginator.page_range %}
    <a href="/domen/?cur_page={{ num }}">{{ num }}</a>
{% endfor %}
{#获取下一页#}
{% if users.has_next %}
    <a href="/domen/?cur_page={{ users.next_page_number }}">下一页</a>
{% endif %}

</div>

二、自定义页面分页

1、处理页数的方法

class PageInfo:
    '''页数处理类'''
    #total  总的数据为列表套对象
    #cur_page  前端发过来的当前页码
    #per_page  一页展示的数据的条数
    #show_page  显示页面下端页码显示的数目
    def __init__(self,total,cur_page,per_page=10,show_page=11):
        a,b=divmod(total,per_page)
        if b!=0:
            a+=1
        self.total=total
        self.cur_page=cur_page
        self.per_page=per_page
        self.show_page=show_page
        self.total_page_num=a
        #获取数据库查询的起始位置
        self.start = (cur_page - 1) * per_page
        #获取数据库的结束位置
        self.end = self.start + per_page
		#获取当前页起始数据的位置
    def get_start_num(self):
        return self.start
		#获取数据库结束数据的位置
    def get_end_num(self):
        return self.end

    def get_page(self):
        #获得距离当前页的数量,用于展示页数多少
        step=self.show_page//2
        #展示页起始点
        begin=self.cur_page-step
        off = self.cur_page + step
        #判断开始页是否小于0等于0,或小于等于0,开始开始页始终设置为1
        if begin<=0:
            begin=1
        #判断最后的几页是否还凑步数
        elif self.total_page_num-self.cur_page<=step:
            off=self.total_page_num
        #判断若总的页数小于需要展示的页数
        if self.total_page_num<self.show_page:
            off=self.total_page_num
        lis=[]
        #判断当前页是否为第一页,若为第一次就不能点击上一页
        if self.cur_page-1<=0:

            str="<li><a href='#'><span aria-hidden='true'>&laquo;</span></a></li>"
        else:
            str="<li><a href='/index/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>&laquo;</span></a></li>"%(self.cur_page-1)

        lis.append(str)
        #遍历获取页数标签
        for index in range(begin,off+1):
            if self.cur_page==index:
                str="<li><a href='/index/?cur_page=%s' style='background:blue;color:white;'>%s</a></li>"%(index,index)
            else:
                str="<li><a href='/index/?cur_page=%s'>%s</a></li>"%(index,index)

            lis.append(str)
        if self.cur_page>=self.total_page_num:

            str="<li><a href='#'><span aria-hidden='true'>&raquo;</span></a></li>"
        else:
            str="<li><a href='/index/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>&raquo;</span></a></li>"%(self.cur_page+1)

        lis.append(str)
        s=" ".join(lis)
        return s

2、分页处理模型类

class IndexPage(View):
    '''分页模型类'''

    def get(self,request):
        #获取当前页这里是字符创格式
        cur_page=request.GET.get('cur_page')
        #将字符创格式的cur_page转化成数字类型
        cur_page=int(cur_page)
        # total=models.DataInfo.objects.all()[0:10]
        
        #获取数据库数据总数量
        total=models.DataInfo.objects.filter(id__lt=40).count()
        #实例化页数处理类的对象
        page_obj=PageInfo(total,cur_page)
        start=page_obj.get_start_num()
        end=page_obj.get_end_num()
        
        #对数据库查出的数据进行切片
        users=models.DataInfo.objects.all()[start:end]
        s=page_obj.get_page()
        return render(request,'index.html',{"user_lis":users,"page":s})

3、分页模板

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
      integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style>

    .page{
        text-align: center;
    }

</style>
<table class="table-bordered table">

    <p class="btn btn-primary">欢迎光临</p>
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>电话</th>
    </tr>
    </thead>
    <tbody>
    {% for user in user_lis %}
        <tr>
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
            <td>{{ user.phone }}</td>
        </tr>
    {% endfor %}


    </tbody>

</table>
<div class="page">

        <nav aria-label="Page navigation">
            <ul class="pagination">
                {{ page | safe }}
            </ul>
        </nav>

    </div>
原文地址:https://www.cnblogs.com/chuwanliu/p/11360128.html