Django的分页器案例
Django的分页器案例
目录结构

ulrs.py
from django.contrib import admin
from django.urls import path
from page import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index)
]
models.py
from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
views.py
from django.shortcuts import render, HttpResponse
from page.models import Book
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# Create your views here.
def index(request):
    # 当前所有书籍对象
    book = Book.objects.all()
    # 分页器对象,每页10条数据
    paginator = Paginator(book, 10)
    # 通过前端get请求获取的当前页码
    visit_page_num = int(request.GET.get('page', 1))
    try:
        # 获取当前页面对象
        page = paginator.page(visit_page_num)
    except EmptyPage: # page=paginator.page(200) 超出页码范围
        page = paginator.page(1)
    except PageNotAnInteger:  # page=paginator.page("zdsds") 当前页码非数字
        page = paginator.page(1)
        
    # 当前页数小于等于2时,页码范围(1,2,3,4,5)
    if visit_page_num <=2:
        page_range = range(1,6)
    # 当前页数大于18小于20时,页码范围(16,17,18,19,20)
    elif paginator.num_pages >= visit_page_num > paginator.num_pages-2 :
        page_range = range(paginator.num_pages-4,paginator.num_pages+1)
    # 如果当前页码数大于最大页码数
    elif visit_page_num >20:
        page_range = range(paginator.num_pages-4,paginator.num_pages+1)
    # 正常范围内显示5个页码数
    else:
        page_range = [visit_page_num-2,visit_page_num-1,visit_page_num,visit_page_num+1,visit_page_num+2]
    return render(request, 'index.html', {
        'paginator': paginator, # 分页器对象,获取 数据总数、总页数、页码的列表
        'page': page, # 当前页面对象
        'page_range': page_range, # 页码的列表
        'visit_page_num':visit_page_num, # 当前页码数
        }
    )
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h1>分页系统</h1>
    <ul>
        {% for book in page %} <!--循环当前页面对象,获取所有数据-->
            <li>{{ book.title }}:{{ book.price }}</li>
        {% endfor %}
    </ul>
    <!--分页-->                                   
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <li>
                <a href="/index?page=1" aria-label="Previous"> <!--首页=当前页面page=1-->
                    <span aria-hidden="true">首页</span>
                </a>
                {% if page.has_previous %} <!--判断是否有上一页-->
                    <!--如果有上一页,就通过链接请求上一页-->
                    <a href="/index?page={{ page.previous_page_number }}" aria-label="Previous">
                        <span aria-hidden="true"><</span>
                    </a>
                {% endif %}
            </li>
            <!--中间的页码数字-->
            {% for page_num in page_range %} <!--循环整个页码数列表-->
                {% if page_num == visit_page_num %} <!--判断循环的页数是否等于当前访问的页数,如果是就加 active-->
                    <li class="active"><a href="/index?page={{ page_num }}">{{ page_num }}</a></li>
                {% else %}
                    <li><a href="/index?page={{ page_num }}">{{ page_num }}</a></li>
                {% endif %}
            {% endfor %}
            <li>
                {% if page.has_next %} <!--判断是否有下一页-->
                    <!--如果有下一页,就通过链接请求下一页-->
                    <a href="/index?page={{ page.next_page_number }}" aria-label="Next">
                        <span aria-hidden="true"> > </span>
                    </a>
                {% endif %}
                <a href="/index?page={{ paginator.num_pages }}" aria-label="Next">
                    <span aria-hidden="true">尾页</span>
                </a>
            </li>
        </ul>
    </nav>
</div>
</body>
</html>

                    
                
 
                
            
        
浙公网安备 33010602011771号