WEB框架-Django组件学习-分页器学习
1.分页器基础学习
1.1 补充知识-批量创建
数据库中数据批量创建,不要每创建一个就往数据库中塞一个,会造成撞库,造成大量I/O操作,速速较慢,应该采用一次性创建大量数据,一次性将大量数据塞入到数据库中。
主要用到:库名.objects.bulk_create(数据)
- def index(request):
- book_list=[]
- for i in range(1,101):
- book = Book(title="book%s"%i,price=i*i)
- book_list.append(book)
- # 数据批量添到数据库中
- Book.objects.bulk_create(book_list)
- return HttpResponse("ok")
展示如下
1.2 django自带分页器组件
1.2.1 django常用参数
- #分页器组件导入
- from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
- #全局信息查询
- paginator = Paginator(book_obj,10) :分页对象,俩个参数,第一个为数据,第二个为每页展示的数量
- paginator.count: 展示分页的数据大小
- paginator.num_pages:展示总计分页数量
- paginator.page_range :类似range的数据类型
- #单页信息查询
- page = paginator.page(1)#页面对象
- page.object_list#打印当前页面的数据量大小
- page.has_next()#是否有下一页
- page.has_previous()#是否有上一页
- page.next_page_number()#当前页的上一页的页码是多少
- page.previous_page_number()#当前页的下一页的页码是多少
1.2.2 其他参数
1.3 分页器的基本应用
1.3.1 分页展示数据
- def book_list(request):
- book_obj = Book.objects.all()
- # 分页器对象
- paginator = Paginator(book_obj,10)
- # 获取当前页码
- current_page = int(request.GET.get("page"))
- # 实例一个页面对象
- page = paginator.page(current_page)
- return render(request,'book_list.html',locals())
- #需要注意的是:在模板层记得更改循环的对象
展示如下
1.3.2 错误页展示
对于超出的页码以及错误输入默认展示第一页
展示如下,错误跳转以及默认跳转
1.3.3 页面页码显示
页面页码展示主要是模板层代码改变
首先调用bootstrap,或文件或cdn
页面展示
1.3.4 上一页,下一页功能
上一页,下一页功能实现,主要用
- page.has_next()#是否有下一页
- page.has_previous()#是否有上一页
- page.next_page_number()#当前页的上一页的页码是多少
- page.previous_page_number()#当前页的下一页的页码是多少
展示如下
视图层完整代码
- def book_list(request):
- book_obj = Book.objects.all()
- # 分页器对象
- paginator = Paginator(book_obj,10)
- try:
- # 获取当前页码,后面默认页为1
- current_page = int(request.GET.get("page"))
- # 实例一个页面对象
- page = paginator.page(current_page)
- # 错误页码默认跳转到首页
- except EmptyPage as e:
- page = paginator.page(1)
- return render(request,'book_list.html',locals())
视图层
模板层完整代码
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
- </head>
- <body>
- <h3>展示数据</h3>
- <ul>
- {% for foo in page %}
- <li>{{ foo }}</li>
- {% endfor %}
- </ul>
- <nav aria-label="Page navigation">
- <ul class="pagination">
- {% if page.has_previous %}
- <li>
- <a href="?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 num in paginator.page_range %}
- {% if current_page == num %}
- <li class="active"><a href="?page={{ num }}">{{ num }}</a></li>
- {% else %}
- <li><a href="?page={{ num }}">{{ num }}</a></li>
- {% endif %}
- {% endfor %}
- {% if page.has_next %}
- <li>
- <a href="?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>
模板层
1.4 分页器的高阶应用
1.4.1 动态加载页码
多余多数据的时候,动态的展示页码,例如博客园的样式
逻辑展示
主要模仿博客园这样,在小于一定页数,默认展示10页,在超过一定页数,展示左5与右5的页码,到最后的一定页面,固定展示一定页数
- 当总页码小于11页时,pageRange = paginator.page_range,展示所有页码即可
- 当页码大于11页时,
- 当当前页码-5<1时,固定展示:pageRange = range(1,11)
- 当当前页码+5>最大页码,展示最后11页:pageRange=range(paginator.num_pages-10,paginator.num_pages+1)
- 其他则正常显示,左5与右5页码:pageRange=range(current_page - 5,current_page+6)
2.模仿django分页器实现自己的分页器组件
2.1 基本展示数据
展示如下,又变成了最开始的样子。。。。。
2.2 自定义页码展示
2.2.1 页码逻辑设置
处理逻辑和之前的一致,不过有部分区别就是不在 是固定的页码,反而是动态的获取
2.2.2 前端页面书写
在同样的函数体内书写
模板层
最后展示
2.3 保留搜索条件
保留搜索条件主要是用于后面用于serch,action,分类时调用参数使用,所以需要保留搜索条件
2.3.1 补充知识点
querydict字典,默认不能编辑
结果报错
如果想要编辑就需要导入包,进行深copy操作
在源码中如果是做copy操作则可以编辑
将querydict的操作转换为字符串操作
2.3.2 保留搜索条件
保留搜索条件的逻辑
展示如下
视图层全部代码
- from django.shortcuts import render,HttpResponse
- # Create your views here.
- from app01.models import Book
- from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
- ####################################自定义组件########################################
- class Pagination(object):
- def __init__(self,request,current_page,all_data,per_page_num,max_page_count=13):
- '''
- current_page :当前页码
- all_count:数据总大小
- per_page_num:每页展示数量
- max_page_count:最大分页数
- '''
- # 如果获取非数字
- try:
- current_page = int(current_page)
- except Exception as e:
- current_page = 1
- #如果获取小于1的数字
- if current_page<1:
- current_page = 1
- self.current_page = current_page
- self.all_count = all_data.count()
- self.per_page_num = per_page_num
- # 总页码
- all_pager,temp = divmod(self.all_count,self.per_page_num)
- if temp:
- all_pager +=1
- self.all_pager = all_pager
- # 最大展示页码以及左右最大展示页码
- self.max_page_count = max_page_count
- self.half_page_count = int((self.max_page_count-1)/2)
- self.request = request
- # 复制的字典
- import copy
- self.params = copy.deepcopy(self.request.GET)
- # 获取切片数据的初始以及结束
- @property
- def start(self):
- return (self.current_page-1)*self.per_page_num
- @property
- def end(self):
- return (self.current_page)*self.per_page_num
- def page_html(self):
- #if 页码大于11时
- if self.all_pager >self.max_page_count:
- if self.current_page<=self.half_page_count:
- pagerange=range(1,self.max_page_count+1)
- elif self.current_page+self.half_page_count > self.all_pager:
- pagerange = range(self.all_pager-self.max_page_count+1,self.all_pager+1)
- else:
- pagerange= range(self.current_page-self.half_page_count,self.current_page+self.half_page_count+1)
- else:
- #页码没有大于11
- pagerange= range(1,self.all_pager+1)
- # 构建分页页码的html
- page_html_list = []
- # 首页
- self.params["page"] = 1
- first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (
- self.params.urlencode(),)
- page_html_list.append(first_page)
- # 上一页
- self.params["page"] = self.current_page - 1
- if self.current_page <= 1:
- prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
- else:
- prev_page = '<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),)
- page_html_list.append(prev_page)
- # self.params: ["page":9,"a":1,"b":2]
- # 正常展示页码
- for i in pagerange:
- self.params["page"] = i
- if i == self.current_page:
- temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
- else:
- temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
- page_html_list.append(temp)
- # 下一页
- self.params["page"] = self.current_page + 1
- if self.current_page >= self.all_pager:
- next_page = '<li class="disabled"><a href="#">下一页</a></li>'
- else:
- next_page = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),)
- page_html_list.append(next_page)
- # 尾页
- self.params["page"] = self.all_pager
- last_page = '<li><a href="?%s">尾页</a></li> </ul></nav>' % (self.params.urlencode())
- page_html_list.append(last_page)
- return ''.join(page_html_list)
- def book_list2(request):
- book_list= Book.objects.all()
- current_page = int(request.GET.get("page", 1))
- pagination = Pagination(request,current_page,book_list,per_page_num=10)
- book_list=book_list[pagination.start:pagination.end]
- return render(request,'book_list2.html',locals())
视图层代码
模板层全部代码
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
- </head>
- <body>
- <ul>
- {% for book in book_list %}
- <li>{{ book }}</li>
- {% endfor %}
- </ul>
- {{ pagination.page_html|safe }}
- </body>
- </html>
模板层代码
a
WEB框架-Django组件学习-分页器学习的更多相关文章
- Python3.5学习十八 Python之Web框架 Django
Python之Web框架: 本质:Socket 引用wsgiref创建web框架 根据web框架创建过程优化所得: 分目录管理 模板单独目录 执行不同函数单独存入一个方法py文件 Web框架的两种形式 ...
- 工作流,WEB框架,UI组件网络收集整理
工作流,WEB框架,UI组件网络收集整理 在博客园上逛了好多年,随手收录了一些工作流,WEB开发框架,UI组件,现在整理一下与大家分享. 由于个人能力与精力有限,望各位园友在评论中补充,我将全部整理到 ...
- python运维开发(十七)----jQuery续(示例)web框架django
内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- WEB框架-Django框架学习-预备知识
今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...
- 冰冻三尺非一日之寒--web框架Django
1.JS 正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Web框架django基础篇
基本配置及学习 路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开 ...
- 利用python web框架django实现py-faster-rcnn demo实例
操作系统.编程环境及其他: window7 cpu python2.7 pycharm5.0 django1.8x 说明:本blog是上一篇blog(http://www.cnblogs.co ...
随机推荐
- 【Python3爬虫】下载酷狗音乐上的歌曲
经过测试,可以下载要付费下载的歌曲(n_n) 准备工作:Python3.5+Pycharm 使用到的库:requests,re,json,time,fakeuseragent 步骤: 打开酷狗音乐的官 ...
- JDK源码分析(8)之 Reference 完全解读
在阅读本文之前最好对 Reference 框架有一个整体的把握,可以参考我上一篇博客 Reference 框架概览 :本文主要讲了 Reference 的子类实现和应用(SoftReference,W ...
- 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)
今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...
- Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法
本篇以实例介绍selenium下的webdriver模块提供的定位页面元素(也可以称为对象)的方法和使用技巧,在此注意:在做WEB自动化测试前,需要对前端相关的技术有所了解,如HTML.XML.Xpa ...
- webpack4.0各个击破(4)—— Javascript & splitChunk
目录 一. Js模块化开发 二. Js文件的一般打包需求 三. 使用webpack处理js文件 3.1 使用babel转换ES6+语法 3.2 脚本合并 3.3 公共模块识别 3.4 代码分割 3.5 ...
- 第8章 概述 - Identity Server 4 中文文档(v1.0.0)
快速入门提供了各种常见IdentityServer方案的分步说明.他们从基础到复杂 - 建议您按顺序完成它们. 将IdentityServer添加到ASP.NET Core应用程序 配置Identit ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- asp.net 建多个项目实现三层的实例——读取一张表中的记录条数
学习asp.net两周,通过学习发现,.net和php之间的区别还是蛮大的,比php要复杂一些,开始学习的有些吃力,后来跟着传智播客里的老师学习,渐渐的学到了一些东西. 今天要记录一下.net里的简单 ...
- 原生JS实现简易轮播图
原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...
- Javascript继承3:将优点为我所有----组合式继承
//声明父类 function ParentClass(name){ //值类型公有属性 this.name = name //引用类型公有属性 this.books = ['Html'] } //父 ...