zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    Python学习系列(七)( 数据库编程)
    Python学习系列(六)(模块)
    web.xml的常见配置
    [springMvc]常见配置
    常用JDBC数据库驱动包和类名
    log4j配置项
    BASE64Encoder cannot be resolved to a type类似问题的解决办法
    IDEA激活码
    eclipse快捷键
    ant 打包脚本
  • 原文地址:https://www.cnblogs.com/chuwanliu/p/11360128.html
Copyright © 2011-2022 走看看