分页器


1.分页器组件+完整功能实现

项目名称:Demo
应用名称:app01

app01/models.py

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(decimal_places=2,max_digits=8)

Demo/urls.py

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('index/', views.index),
    path('addbook/', views.addBook),
]

app01/views.py

from django.shortcuts import render,HttpResponse
from app01.models import *

# Paginator分页器组件,EmptyPage对应没找到的页面的报错
from django.core.paginator import Paginator,EmptyPage


def addBook(request):
    # 在数据库中准备大量的数据
    # 作死的玩儿法!执行了100条insert语句,效率很低
    # for i in range(100):
    #     Book.objects.create(title="book_%s"%i,price=i*i)

    # 批量插入数据 bulk_create
    book_list = []
    for i in range(100):
        book = Book(title="book_%s"%i,price=i*i)
        book_list.append(book)

    Book.objects.bulk_create(book_list)
    return HttpResponse("OK")


def index(request):
    book_list = Book.objects.all()

    """分页器使用 Paginator参数(查询对象列表QuerySet,每一页的数据个数,?)
    book_list=Book.objects.all()
    paginator = Paginator(book_list,10)
    paginator.count     # 数据总数
    paginator.num_pages  # 分的页数
    paginator.page_range # 页码的列表范围

    page1 = paginator.page(1) # 拿到第一页的数据对象
    print(page1.object_list) # 该对象下面的数据 QuerySet
    示例:
    for i in page1: # 每个i就是一个数据对象
        print(i)
        

    page2 = paginator.page(2)
    page2.has_next()             # 是否有下一页
    page2.next_page_number()     # 下一页的页码
    page2.has_previous()         # 是否有上一页
    page2.previous_page_number() # 上一页的页码

    # 抛错
    page=paginator.page(999999999999...)   # error:EmptyPage
    page=paginator.page("z")   # error:PageNotAnInteger
    """
    paginator = Paginator(book_list,2)
    try:
        # 拿到当前的页数,get里面的第二个参数为键值的默认设置值
        page_order = int(request.GET.get("page",1))
        # 当上一页或者下一页超过了页数范围,跳转到第一页
        if page_order not in paginator.page_range:
            print('paginator.page_range',paginator.page_range)
            print("page_order",page_order)
            page_order = 1
    except EmptyPage as e:
        page_order = 1

    page_range = paginator.page_range
    current_page = paginator.page(page_order)

    # 显示部分分页器功能
    if page_order - 5 < 1:
        page_range = range(1,12)
    elif page_order + 5 > paginator.num_pages:
        page_range = range(paginator.num_pages - 11, paginator.num_pages + 1)
    else:
        page_range = range(page_order - 5,page_order + 6)
    return render(request,"index.html",locals())

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
{#    bootstrap cdn #}
    <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>
<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 %}

        {% if page_order < 7%}
            <span></span>
            {% else %}
            <li><a href="?page={{ page_order|add:-6 }}">...</a></li>
        {% endif %}

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

        {% if page_order > paginator.num_pages|add:-6 %}
            <span></span>
            {% else %}
            <li><a href="?page={{ page_order|add:6 }}">...</a></li>
        {% endif %}

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

      </ul>
    </nav>



</body>
</html>
posted @ 2018-08-04 20:31  哈哈大圣  阅读(89)  评论(0编辑  收藏  举报