zoukankan      html  css  js  c++  java
  • DAY82-Django框架(十二)分页器

    一、分页器

    语法

    from django.core.paginator import Paginator
    #复制代码
    #Paginator对象:    
    paginator = Paginator(user_list, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象    
    page对象:page=paginator.page(1)
    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    # paginator             paginator对象
    

    案例一:基础分页器

    视图层

    from django.shortcuts import render,HttpResponse
    from app01 import  models
    from django.core.paginator import Paginator,EmptyPage
    # Create your views here.
    def page(request):
        # 批量生成数据,并放入列表
        # books=[]
        # for i in range(100):
        #     books.append(models.Book(name='书%s'%i,price=i))
        # 批量导入数据
        # models.Book.objects.bulk_create(books)
    
        books = models.Book.objects.all()
        #Paginator:object_list:对象列表, per_page:每页显示的条数
        #生成一个Paginator对象
        paginator = Paginator(books,10)
        #捕获异常就从第一页显示
        try:
            #从前端GET拿到页面的p
            current_page_num = int(request.GET.get('p'))
            #current_page:是一个page对象,可以被循环,循环出来的是当前页的内容
            current_page=paginator.page(current_page_num)
        except Exception as e:
            current_page_num = 1
            current_page = paginator.page(current_page_num)
        return render(request,'page.html',locals())
    

    模板层

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    </head>
    <body>
    <div class=" col-md-offset-3 col-md-6">
        <table class='table table-striped' border="1">
            <thead>
            <tr>
                <th>书名</th>
                <th>价格</th>
            </tr>
            </thead>
            <tbody>
             <!--current_page:是可以被循环的,循环出来的是当前页的内容,相当于book对象-->
            {% for book in current_page %}
                <tr>
                    <td>{{ book.name }}</td>
                    <td>{{ book.price }}</td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <!-- page对象.has_previous:判断当前页是否存在上一页,返回True/False 
    			page对象.previous_page_number:上一页的页码 -->
                {% if current_page.has_previous %}
                    <li>
                        <a href="/page/?p={{ current_page.previous_page_number }}" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% endif %}
    			<!-- Paginator对象.page_range:总页数的范围,range(1, 11) -->
                {% for num in paginator.page_range %}
                	<!-- page对象.number:当前页码 -->
                    {% if num == current_page.number %}
                        <li class="active"><a href="/page/?p={{ num }}">{{ num }}</a></li>
                    {% else %}
                        <li><a href="/page/?p={{ num }}">{{ num }}</a></li>
                    {% endif %}
                {% endfor %}
    			<!-- page对象.has_next:判断当前页是否存在下一页,返回True/False 
    			page对象.next_page_number:下一页的页码-->
                {% if current_page.has_next %}
                    <li>
                        <a href="/page/?p={{ current_page.next_page_number }}" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% endif %}
            </ul>
        </nav>
    </div>
    </body>
    </html>
    

    案例二:加强版的分页器

    要求:当页码数超过11时;左右显示各5个。

    视图层

    def page2(request):
        books = models.Book.objects.all()
        paginator = Paginator(books,3)
        try:
            current_page_num = int(request.GET.get('p'))
            current_page=paginator.page(current_page_num)
            #判断总页数是否超过10
            if paginator.num_pages >10:
                # 当前页码数-5大于1的时候,page_range最小是1,不会再超出
                if current_page_num-5<1:
                    page_range = range(1, 12)
                # 当前页码数+5大于总页码数,page_range最大是paginator.num_pages+1
                elif current_page_num+5>paginator.num_pages:
                    page_range = range(paginator.num_pages - 10, paginator.num_pages+1)
                # 当前页码数在中间,没有靠近1或最后,就只显示左5右5
                else:
                    page_range = range(current_page_num-5,current_page_num+6)
            else:
                page_range=paginator.page_range
        except Exception as e:
            current_page_num = 1
            current_page = paginator.page(current_page_num)
        return render(request, 'page2.html', locals())
    

    模板层

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    </head>
    <body>
    <div class=" col-md-offset-3 col-md-6">
        <table class='table table-striped' border="1">
            <thead>
            <tr>
                <th>书名</th>
                <th>价格</th>
            </tr>
            </thead>
            <tbody>
            {% for book in current_page %}
                <tr>
                    <td>{{ book.name }}</td>
                    <td>{{ book.price }}</td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                {% if current_page.has_previous %}
                    <li>
                        <a href="/page2/?p={{ current_page.previous_page_number }}" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% endif %}
    <!--唯一改变的地方:
    				循环的不再是总页码的范围,而是自定义的范围page_range-->
                {% for num in page_range %}
                    {% if num == current_page.number %}
                        <li class="active" ><a href="/page2/?p={{ num }}" style=" 40px;text-align: center">{{ num }}</a></li>
                    {% else %}
                        <li ><a href="/page2/?p={{ num }}" style=" 40px;text-align: center">{{ num }}</a></li>
                    {% endif %}
                {% endfor %}
    
                {% if current_page.has_next %}
                    <li>
                        <a href="/page2/?p={{ current_page.next_page_number }}" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% endif %}
            </ul>
        </nav>
    </div>
    </body>
    </html>
    
  • 相关阅读:
    Redis持久化机制
    Java动态代理
    FFmpeg视频处理
    Redis集群
    解决vscode无法提示golang的问题
    解决vscode无法安装golang相关插件的问题
    近期小结
    近期小结
    稍稍解读下ThreadPoolExecutor
    响应式编程笔记三:一个简单的HTTP服务器
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9989754.html
Copyright © 2011-2022 走看看