文章目录
一、Django内置paginator分页器
1.数据准备
models.py文件创建表类
from django.db import models
# Create your models here.
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
age=models.IntegerField()
authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid")
def __str__(self):
return self.name
class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
addr=models.CharField( max_length=64)
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
city=models.CharField( max_length=32)
email=models.EmailField()
def __str__(self):
return self.name
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)
publish=models.ForeignKey(to="Publish",to_field="nid")
authors=models.ManyToManyField(to='Author',)
def __str__(self):
return self.title
指定数据库同步指令:makemigrations和migrate
在views外使用Django环境创建数据
在应用文件app01下创建一个py文件,名字随意,如init_book_table.py
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day068_model_form_lesson.settings") # 引入django的环境
import django
django.setup() # 运行Django环境,之后可以使用django中的其他文件
from app01 import models
import random
l1 = []
for i in range(1, 81): # 创建100条记录
obj = models.Book(
title='红楼梦第%s回'%i,
price= random.randint(100,200),
publishDate='1998-06-%s'%(random.randint(1,30)),
publish_id=random.randint(1,3),
)
l1.append(obj)
models.Book.objects.bulk_create(l1)
创建好后,直接右键运行即可,就可以用DJango环境执行这段代码,在数据库中创建100天记录。
2.paginator对象常用属性和方法
使用django内置的分页器需要导入分页器类
from django.core.paginator import Paginator,EmptyError # EmptyError是一个没有取到页面的错误
通过给Paginator类传递所有数据的queryset对象,以及每页显示数量来实例化一个paginator对象。这个对象有所有对分页的处理方法。
paginator对象属性
paginator.count:返回所有记录的总数量
paginator.num_pages:返回分页后的总页数
paginator.page_range:返回分页后的页码范围,一个range对象
all_books = models.Book.objects.all()
paginator = Paginator(all_books,10) # 将所有的book对象传给Paginator生成分页器对象,10表示每一页展示的数据数量
"""paginator对象的属性"""
print("count",paginator.count) # 显示数据总数量 count 83
print("num_pages",paginator.num_pages) # 显示分页后总页数 num_pages 9
print("page_range",paginator.page_range) # 显示页面的范围 page_range range(1, 10)
paginator对象的方法
- page_obj = paginator.page(page):获取某一页所有数据的一个对象
- 如果页码值不在页码范围内,抛出异常error:EmptyPage 超过页码范围
- 如果页码值非法:抛出异常error:PageNotAnInteger 非法页码值
page_obj对象的方法
- page_obj.has_next():判断当前页是否有下一页
- page_obj.next_page_number():下一页的页码
- page_obj.has_previous():判断当前页是否有上一页
- page_obj.previous_page_number():上一页的页码
all_books = models.Book.objects.all()
paginator = Paginator(all_books,10) # 将所有的book对象传给Paginator生成分页器对象,10表示每一页展示的数据数量
"""paginator对象的属性"""
print("count",paginator.count) # 显示数据总数量 count 83
print("num_pages",paginator.num_pages) # 显示分页后总页数 num_pages 9
print("page_range",paginator.page_range) # 显示页面的范围 page_range range(1, 10)
3.Django分页器实现分页
视图函数部分
from django.shortcuts import render, redirect, HttpResponse
from utils.modelFormLesson import BookForm
from app01 import models
from django.core.paginator import Paginator,EmptyPage
def show(request):
if request.method == "GET":
all_books = models.Book.objects.all()
paginator = Paginator(all_books,10) # 将所有的book对象传给Paginator生成分页器对象,10表示每一页展示的数据数量
"""paginator对象的属性"""
print("count",paginator.count) # 显示数据总数量 count 83
print("num_pages",paginator.num_pages) # 显示分页后总页数 num_pages 9
print("page_range",paginator.page_range) # 显示页面的范围 page_range range(1, 10)
# """paginator对象的方法"""
# page1 = paginator.page(1) # 获取第一页的所有数据
# print(page1)
# for i in page1:
# print(i)
#
# page_obj = paginator.page(2)
# print("是否有下一页",page_obj.has_next()) # 是否有上一页 True
# print("下一页的页码",page_obj.next_page_number()) # 下一页的页码 3
# print("是否有上一页",page_obj.has_previous()) # 是否有下一页 True
# print("上一页的页码",page_obj.previous_page_number()) # 上一页的页码 1
"""分页逻辑部分"""
current_page_num = request.GET.get("page",1) # 获取请求页面,也就是当前页
current_page_num = int(current_page_num)
all_pages = paginator.num_pages # 分页后的所有页数
try:
current_books = paginator.page(current_page_num) # 获取当前页的所有数据
except EmptyPage:
current_books = paginator.page(paginator.num_pages)
print