分页器
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>