Django分页器

1 Django的分页器(paginator)简介

在页面显示分页数据,需要用到Django分页器组件

from django.core.paginator import Paginator

Paginator对象:    paginator = Paginator(user_list, 10)
# per_page: 每页显示条目数量
# count:    数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page:     page对象    
page对象:page=paginator.page(1)
# has_next              是否有下一页
# next_page_number      下一页页码
# has_previous          是否有上一页
# previous_page_number  上一页页码
# object_list           分页之后的数据列表
# number                当前页
# paginator             paginator对象

2 应用View层

from django.shortcuts import render,HttpResponsefrom app01.models import *
from django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerdef index(request):'''批量导入数据:Booklist=[]for i in range(100):Booklist.append(Book(title="book"+str(i),price=30+i*i))Book.objects.bulk_create(Booklist)''''''
分页器的使用:book_list=Book.objects.all()paginator = Paginator(book_list, 10)print("count:",paginator.count)           #数据总数print("num_pages",paginator.num_pages)    #总页数print("page_range",paginator.page_range)  #页码的列表page1=paginator.page(1) #第1页的page对象for i in page1:         #遍历第1页的所有数据对象print(i)print(page1.object_list) #第1页的所有数据page2=paginator.page(2)print(page2.has_next())            #是否有下一页print(page2.next_page_number())    #下一页的页码print(page2.has_previous())        #是否有上一页print(page2.previous_page_number()) #上一页的页码# 抛错#page=paginator.page(12)   # error:EmptyPage#page=paginator.page("z")   # error:PageNotAnInteger'''book_list=Book.objects.all()paginator = Paginator(book_list, 10)page = request.GET.get('page',1)currentPage=int(page)try:print(page)book_list = paginator.page(page)except PageNotAnInteger:book_list = paginator.page(1)except EmptyPage:book_list = paginator.page(paginator.num_pages)return render(request,"index.html",{"book_list":book_list,"paginator":paginator,"currentPage":currentPage})

3 模版层 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"><h4>分页器</h4><ul>{% for book in book_list %}<li>{{ book.title }} -----{{ book.price }}</li>{% endfor %}</ul><ul class="pagination" id="pager">{% if book_list.has_previous %}<li class="previous"><a href="/index/?page={{ book_list.previous_page_number }}">上一页</a></li>{% else %}<li class="previous disabled"><a href="#">上一页</a></li>{% endif %}{% for num in paginator.page_range %}{% if num == currentPage %}<li class="item active"><a href="/index/?page={{ num }}">{{ num }}</a></li>{% else %}<li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li>{% endif %}{% endfor %}{% if book_list.has_next %}<li class="next"><a href="/index/?page={{ book_list.next_page_number }}">下一页</a></li>{% else %}<li class="next disabled"><a href="#">下一页</a></li>{% endif %}</ul>
</div></body>
</html>

4 扩展

'''显示左5,右5,总共11个页,1 如果总页码大于111.1 if 当前页码减5小于1,要生成1到12的列表(顾头不顾尾,共11个页码)page_range=range(1,12)1.2 elif 当前页码+5大于总页码,生成当前页码减10,到当前页码加1的列表(顾头不顾尾,共11个页码)page_range=range(paginator.num_pages-10,paginator.num_pages+1)1.3 else 生成当前页码-5,到当前页码+6的列表page_range=range(current_page_num-5,current_page_num+6)2 其它情况,生成的列表就是pageinator的page_rangepage_range=paginator.page_range'''
def index(request):book_list=Book.objects.all()paginator = Paginator(book_list, 15)page = request.GET.get('page',1)currentPage=int(page)#  如果页数十分多时,换另外一种显示方式if paginator.num_pages>11:if currentPage-5<1:pageRange=range(1,11)elif currentPage+5>paginator.num_pages:pageRange=range(currentPage-5,paginator.num_pages+1)else:pageRange=range(currentPage-5,currentPage+5)else:pageRange=paginator.page_rangetry:print(page)book_list = paginator.page(page)except PageNotAnInteger:book_list = paginator.page(1)except EmptyPage:book_list = paginator.page(paginator.num_pages)return render(request,"index.html",locals())
def page_test(request):# book_list=[]# for i in range(100):#     book=Book(name='book%s'%i,price=10+i,pub_date='2018-09-18',publish_id=1)#     book_list.append(book)# Book.objects.bulk_create(book_list,10)book_list=Book.objects.all()# 生成paginator对象,传入书籍列表,每页10条数据paginator=Paginator(book_list,3)# 总页码数print(paginator.num_pages)# 页码列表print(paginator.page_range)# 总数据print(paginator.count)# 获取页面传来的页码current_page=int(request.GET.get('page',1))page_range=[]# 左5 右5# 获取页面传来的页码的page对象try:page=paginator.page(current_page)# print(page.has_next())            #是否有下一页# print(page.next_page_number())    #下一页的页码# print(page.has_previous())        #是否有上一页# print(page.previous_page_number()) #上一页的页码# 循环打印出当页对象for i in page:print(i)except Exception as e:current_page=1page = paginator.page(1)if paginator.num_pages>11:if current_page+5>paginator.num_pages:page_range=range(paginator.num_pages-10,paginator.num_pages+1)elif current_page-5<1:page_range=range(1,12)else:page_range=range(current_page-5,current_page+6)else:page_range=paginator.page_rangereturn render(request,'page_test.html',locals())
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><title>Title</title>
</head>
<body><ul>{% for foo in page %}<li>{{ foo.name }}</li>{% endfor %}</ul>
<nav aria-label="Page navigation"><ul class="pagination">{% if page.has_previous %}<li><a href="/page_test/?page={{ 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 %}{% for foo in page_range %}{% if current_page == foo %}<li class="active"><a href="/page_test/?page={{ foo }}">{{ foo }}</a></li>{% else %}<li><a href="/page_test/?page={{ foo }}">{{ foo }}</a></li>{% endif %}{% endfor %}{% if page.has_next %}<li><a href="/page_test/?page={{ page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>{% else %}<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>{% endif %}</ul>
</nav></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql:用SHOW CREATE TABLE tbl_name查看创建表的SQL语句

https://dev.mysql.com/doc/refman/8.2/en/show-create-table.html 可以用SHOW CREATE TABLE tbl_name查看创建表的SQL语句。 例如&#xff0c;SHOW CREATE TABLE test_table;表示查询创建test_table表的SQL语句&#xff1a;

刘元昌:期待更多年轻人的第一杯精酿是失眠企鹅

12月7日下午&#xff0c;2023&#xff08;第十八届&#xff09;大河财富中国论坛盛大开启。作为先行论坛&#xff0c;2023新消费峰会火热开场。此次峰会以“提质新消费 释放新活力”为主题&#xff0c;集论坛、演绎、展示、互动为一体&#xff0c;把峰会变身“秀场”&#xff0…

基于Java住院部病人信息管理系统

基于Java住院部病人信息管理系统 功能需求 1、病人信息管理&#xff1a;系统需要提供病人信息管理功能&#xff0c;包括病人的基本信息&#xff08;如姓名、性别、年龄、联系方式等&#xff09;和医疗信息&#xff08;如病史、病情、诊断结果等&#xff09;。 2、病房管理&a…

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足

目录 前言 出现的问题: 解决方法&#xff1a; 编译安装&#xff1a; 极速安装 其他 我的其他博客 前言 说实话&#xff0c;本人也就是个穷学生买不起啥大的服务器啥的&#xff0c;整了个2核 2内存的服务器 用宝塔按mysql5.5是没问题的&#xff0c;一切换8.0就提醒内存不足…

可信人工智能

定义 可信AI&#xff0c;就是确保AI的公平性、可解释性、健壮性和透明性&#xff0c;确保算法可被人信任。 存在的问题 算法不鲁棒导致的应用风险 自动驾驶汽车未能及时识别行人导致的交通事故黑箱模型导致算法难以解释&#xff0c;对用户不透明 难以推广至医疗、金融等需要…

UE5 - ArchvizExplorer与Map Border Collection结合 - 实现电子围栏效果

插件地址&#xff1a; https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://www.unrealengine.com/marketplace/zh-CN/product/map-border-collection ArchvizExplorer扩展&#xff1a; https://download.csdn.net/download/qq_17523181/8843305…

freemarker+Aspose.word实现模板生成word并转成pdf

需求&#xff1a;动态生成pdf指定模板 实现途径&#xff1a;通过freemarker模板&#xff0c;导出word文档&#xff0c;同时可将word转为pdf。 技术选择思路 思路一&#xff1a;直接导出pdf 使用itext模板导出pdf 适用范围 业务生成的 pdf 是具有固定格式或者模板的文字及其…

数据采集网关:工业数据采集上云

数据采集网关&#xff0c;以其高效、便捷的特点&#xff0c;成为了现代工业物联网数据采集处理的重要工具。它是连接不同数据源和数据接收设备的桥梁&#xff0c;将各种形式和格式的数据快速、安全地汇聚到一起。通过数据采集网关&#xff0c;企业可以轻松实现数据的整合、转换…

函数创建与使用

函数使用的原因 函数是设计出来是为了完成某项功能的代码块。只要调用就能执行。实现代码复用。代码复用是不是复制&#xff0c;而是同样的代码不用写很多。只要用调用的代码来写&#xff0c;就能完成。将功能代码放到某个地方。函数的设计就是为了代码复用。 声明函数和调用…

《人性的弱点》读后感

《人性的弱点》这本书的每个章节都引人深思&#xff0c;让我对人性有了更深入的理解。以下是我对每个章节的读后感&#xff1a; 第一章&#xff1a;自我意识 这一章讲述了人性中最基本的一面&#xff0c;即自我意识。每个人都渴望被重视&#xff0c;希望得到他人的认可和赞赏…

【算法题】字符统计及重排(js)

解法&#xff1a; const str "xyxyXX"; const str1 "abababb"; function solution(str) {const strArr str.split("").sort((a, b) > a - b);const map new Map();for (let i 0; i < strArr.length; i) {if (map.has(strArr[i])) {m…

Chrome 将禁止修改 document.domain

参考链接1&#xff1a;https://developer.chrome.com/blog/immutable-document-domain?hlzh-cn 参考链接2&#xff1a;https://juejin.cn/post/7238980109453525050 为什么设置document.domain,跨域依旧报错&#xff1f;

推荐系统,推荐模型中负样本的选择和采集

推荐系统中&#xff0c;负样本的采集通常是一个挑战&#xff0c;因为用户往往只提供他们喜欢的项目的反馈&#xff0c;而不喜欢的项目的反馈通常是缺失的。以下是一些常见的负样本采集策略&#xff1a;   1. 随机采样&#xff1a;这是最常见的策略&#xff0c;就是从用户未互…

摇头机,舞台灯,白色家电,3D打印,医疗器械等安防芯片步进驱动选型GC系列,低成本,大电流

GLOBALCHIP新一代的安防产品用的芯片&#xff0c;GC3901 GC3909 GC3910 GC3911 GC8548 GC8549 GC6609 GC6610 GC2003 GC2803 GC2804步进驱动 达林顿选型型号&#xff0c;采用12V H 桥驱动器。其中最大持续电流(A)可达2.5A。其中GC6610&#xff0c;GC6609 是36V&#xff0c;低成…

Linux查询内存或CPU占用最多的几个进程

一、可以使用以下命令查使用内存最多的10个进程 方法1&#xff1a; ps -aux | sort -k4nr | head -10 如果是最高的三个&#xff0c;10改为3即可 命令解释&#xff1a; 1. ps&#xff1a;参数a指代all——所有的进程&#xff0c;u指代userid——执行该进程的用户id&#xff…

QT学习(2):信号槽机制

目录 信号槽机制定义连接一、标准connect链接1、QObject::connect2、QMetaObjectPrivate::connect3、信号槽容器Conntion、ConnectionList、SignalVector、ConnectionData 二、函数指针链接(qt5后)三、Lamba表达式 触发 信号槽机制 信号槽是观察者模式的一种实现&#xff0c;订…

14-Kafka-Day02

第 4 章 Kafka Broker 4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 bin/zkCli.sh 因为你在配置kafka的时候指定了它的名字。 &#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: …

超越边界:Mistral 7B挑战AI新标准,全面超越Llama 2 13B

引言 在人工智能领域&#xff0c;模型的性能一直是衡量其价值和应用潜力的关键指标。近日&#xff0c;一个新的里程碑被设立&#xff1a;Mistral AI发布了其最新模型Mistral 7B&#xff0c;它在众多基准测试中全面超越了Llama 2 13B模型&#xff0c;标志着AI技术的一个重大进步…

深兰科技“汉境”入选2023年湖北省人工智能十大优秀应用案例

11月18日&#xff0c;央视“专精特新制造强国”城市大会在湖北武汉召开。会上&#xff0c;正式发布了“湖北省工业互联网标识十大优秀应用案例”&#xff0c;由深兰科技(武汉)股份有限公司基于AIGC多模态融合大模型技术开发打造的江汉路步行街元宇宙场景应用——汉境&#xff0…

Java异步编程之利器:Guava异步编程实践

第1章&#xff1a;引言 - 为什么要用Guava进行异步编程&#xff1f; 大家好&#xff0c;我是小黑&#xff01;今天咱们要聊的是Guava在异步编程中的应用。首先&#xff0c;让我们搞清楚为什么要用Guava来处理异步任务。在Java的世界里&#xff0c;异步编程是个老话题了&#x…