小白IT:Django框架—分页器paginator

一、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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值