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>
原文地址:https://www.cnblogs.com/xvchengqi/p/9989754.html