Django组件-分页器

分页器(paginator)

views.py

from django.shortcuts import render

from app01.models import Book

from django.core.paginator import Paginator, EmptyPage

def index(request):
    # 效率低,每次都要insert一下
    # for i in range(100):
    #     Book.objects.create(
    #         title=f'book_{i}',
    #         price=i * i'
    #     )

    # 批量导入,一条insert后面对应100条数据
    # book_list = []
    # for i in range(100):
    #     book = Book(title=f'book_{i}', price=i * i)
    #     book_list.append(book)
    #
    # Book.objects.bulk_create(book_list)

    book_list = Book.objects.all()

    # 分页器
    paginator = Paginator(book_list, 3)
    print("count:", paginator.count)  # 数据总数
    print("num_pages", paginator.num_pages)  # 总页数
    print("page_range", paginator.page_range)  # 页码的列表

    # 抛错
    # page=paginator.page(12)   # error:EmptyPage

    # page=paginator.page("z")   # error:PageNotAnInteger

    current_page_num = int(request.GET.get('page', 1))

    if paginator.num_pages > 11:
        if current_page_num - 5 < 1:
            page_range = range(1, 11)
        elif current_page_num + 5 > paginator.num_pages:
            page_range = range(paginator.num_pages - 10, paginator.num_pages + 1) # range顾头不顾尾
        else:
            page_range = range(current_page_num - 5, current_page_num + 6)

    else:
        page_range = paginator.page_range
    try:

        current_page = paginator.page(current_page_num)

        # 显示某一页具体数据的两种方式
        print('object_list', current_page.object_list)
        for i in current_page:
            print(i)
    except EmptyPage as e:
        current_page = paginator.page(1)

    # print(current_page.has_next())  # 是否有下一页
    # print(current_page.next_page_number())  # 下一页的页码
    # print(current_page.has_previous())  # 是否有上一页
    # print(current_page.previous_page_number())  # 上一页的页码

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="/static/bs/css/bootstrap.css">
</head>
<body>

<ul>
    {% for book in current_page %}
        <li>{{ book.title }} : {{ book.price }}</li>
    {% endfor %}

</ul>

<nav aria-label="Page navigation">
    <ul class="pagination">

        {% if current_page.has_previous %}
            <li>
                <a href="?page={{ 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 %}
    

        {% for item in page_range %}
            {% if current_page_num == item %}
                <li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
            {% else %}
                <li><a href="?page={{ item }}">{{ item }}</a></li>
            {% endif %}
        {% endfor %}

    
        {% if current_page.has_next %}
            <li>
                <a href="?page={{ 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>

</body>
</html>

扩展

def index(request):

    book_list=Book.objects.all()
    paginator = Paginator(book_list, 15)
    page = request.GET.get('page',1)
    currentPage=int(page)

    #  如果页数十分多时,换另外一种显示方式
    if paginator.num_pages>11:
        if currentPage-5<1:
            pageRange=range(1,11)
        elif currentPage+5>paginator.num_pages:
            pageRange=range(currentPage-5,paginator.num_pages+1)
        else:
            pageRange=range(currentPage-5,currentPage+5)
    else:
        pageRange=paginator.page_range
    try:
        print(page)
        book_list = paginator.page(page)
    except PageNotAnInteger:
        book_list = paginator.page(1)
    except EmptyPage:
        book_list = paginator.page(paginator.num_pages)

    return render(request,"index.html",locals())
原文地址:https://www.cnblogs.com/hexiaorui123/p/10584454.html