1.分页器基础学习

1.1 补充知识-批量创建

数据库中数据批量创建,不要每创建一个就往数据库中塞一个,会造成撞库,造成大量I/O操作,速速较慢,应该采用一次性创建大量数据,一次性将大量数据塞入到数据库中。

主要用到:库名.objects.bulk_create(数据)

  1. def index(request):
  2. book_list=[]
  3. for i in range(1,101):
  4. book = Book(title="book%s"%i,price=i*i)
  5. book_list.append(book)
  6.  
  7. # 数据批量添到数据库中
  8. Book.objects.bulk_create(book_list)
  9. return HttpResponse("ok")

展示如下

1.2 django自带分页器组件

1.2.1 django常用参数

  1. #分页器组件导入
  2. from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
  3.  
  4. #全局信息查询
  5.  
  6. paginator = Paginator(book_obj,10) :分页对象,俩个参数,第一个为数据,第二个为每页展示的数量
  7. paginator.count 展示分页的数据大小
  8. paginator.num_pages:展示总计分页数量
  9. paginator.page_range :类似range的数据类型
  10.  
  11. #单页信息查询
  12.  
  13. page = paginator.page(1)#页面对象
  14. page.object_list#打印当前页面的数据量大小
  15. page.has_next()#是否有下一页
  16. page.has_previous()#是否有上一页
  17. page.next_page_number()#当前页的上一页的页码是多少
  18. page.previous_page_number()#当前页的下一页的页码是多少

1.2.2 其他参数

1.3 分页器的基本应用

1.3.1 分页展示数据

  1. def book_list(request):
  2.  
  3. book_obj = Book.objects.all()
  4. # 分页器对象
  5. paginator = Paginator(book_obj,10)
  6. # 获取当前页码
  7. current_page = int(request.GET.get("page"))
  8. # 实例一个页面对象
  9. page = paginator.page(current_page)
  10.  
  11. return render(request,'book_list.html',locals())
  12. #需要注意的是:在模板层记得更改循环的对象

展示如下

1.3.2 错误页展示

对于超出的页码以及错误输入默认展示第一页

展示如下,错误跳转以及默认跳转

1.3.3 页面页码显示

页面页码展示主要是模板层代码改变

首先调用bootstrap,或文件或cdn

页面展示

1.3.4 上一页,下一页功能

上一页,下一页功能实现,主要用

  1. page.has_next()#是否有下一页
  2. page.has_previous()#是否有上一页
  3. page.next_page_number()#当前页的上一页的页码是多少
  4. page.previous_page_number()#当前页的下一页的页码是多少

展示如下

视图层完整代码

  1. def book_list(request):
  2.  
  3. book_obj = Book.objects.all()
  4. # 分页器对象
  5. paginator = Paginator(book_obj,10)
  6. try:
  7. # 获取当前页码,后面默认页为1
  8. current_page = int(request.GET.get("page"))
  9. # 实例一个页面对象
  10. page = paginator.page(current_page)
  11. # 错误页码默认跳转到首页
  12. except EmptyPage as e:
  13. page = paginator.page(1)
  14.  
  15. return render(request,'book_list.html',locals())

视图层

模板层完整代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <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">
  8. </head>
  9. <body>
  10. <h3>展示数据</h3>
  11. <ul>
  12. {% for foo in page %}
  13. <li>{{ foo }}</li>
  14.  
  15. {% endfor %}
  16.  
  17. </ul>
  18. <nav aria-label="Page navigation">
  19. <ul class="pagination">
  20. {% if page.has_previous %}
  21. <li>
  22. <a href="?page={{ page.previous_page_number }}" aria-label="Previous">
  23. <span aria-hidden="true">上一页</span>
  24. </a>
  25. </li>
  26. {% else %}
  27. <li class="disabled">
  28. <a href="#" aria-label="Previous">
  29. <span aria-hidden="true">上一页</span>
  30. </a>
  31. </li>
  32.  
  33. {% endif %}
  34. {% for num in paginator.page_range %}
  35. {% if current_page == num %}
  36. <li class="active"><a href="?page={{ num }}">{{ num }}</a></li>
  37. {% else %}
  38. <li><a href="?page={{ num }}">{{ num }}</a></li>
  39. {% endif %}
  40.  
  41. {% endfor %}
  42. {% if page.has_next %}
  43. <li>
  44. <a href="?page={{ page.next_page_number }}" aria-label="Next">
  45. <span aria-hidden="true">下一页</span>
  46. </a>
  47. </li>
  48. {% else %}
  49. <li class="disabled">
  50. <a href="#" aria-label="Next">
  51. <span aria-hidden="true">下一页</span>
  52. </a>
  53. </li>
  54. {% endif %}
  55.  
  56. </ul>
  57. </nav>
  58. </body>
  59. </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 保留搜索条件

保留搜索条件的逻辑

展示如下

视图层全部代码

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # Create your views here.
  4. from app01.models import Book
  5. from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
  6.  
  7. ####################################自定义组件########################################
  8. class Pagination(object):
  9. def __init__(self,request,current_page,all_data,per_page_num,max_page_count=13):
  10. '''
  11. current_page :当前页码
  12. all_count:数据总大小
  13. per_page_num:每页展示数量
  14. max_page_count:最大分页数
  15. '''
  16. # 如果获取非数字
  17. try:
  18. current_page = int(current_page)
  19. except Exception as e:
  20. current_page = 1
  21.  
  22. #如果获取小于1的数字
  23. if current_page<1:
  24. current_page = 1
  25.  
  26. self.current_page = current_page
  27. self.all_count = all_data.count()
  28. self.per_page_num = per_page_num
  29.  
  30. # 总页码
  31. all_pager,temp = divmod(self.all_count,self.per_page_num)
  32. if temp:
  33. all_pager +=1
  34. self.all_pager = all_pager
  35.  
  36. # 最大展示页码以及左右最大展示页码
  37. self.max_page_count = max_page_count
  38. self.half_page_count = int((self.max_page_count-1)/2)
  39. self.request = request
  40.  
  41. # 复制的字典
  42. import copy
  43. self.params = copy.deepcopy(self.request.GET)
  44.  
  45. # 获取切片数据的初始以及结束
  46. @property
  47. def start(self):
  48. return (self.current_page-1)*self.per_page_num
  49.  
  50. @property
  51. def end(self):
  52. return (self.current_page)*self.per_page_num
  53.  
  54. def page_html(self):
  55. #if 页码大于11时
  56. if self.all_pager >self.max_page_count:
  57. if self.current_page<=self.half_page_count:
  58. pagerange=range(1,self.max_page_count+1)
  59. elif self.current_page+self.half_page_count > self.all_pager:
  60. pagerange = range(self.all_pager-self.max_page_count+1,self.all_pager+1)
  61. else:
  62. pagerange= range(self.current_page-self.half_page_count,self.current_page+self.half_page_count+1)
  63. else:
  64. #页码没有大于11
  65. pagerange= range(1,self.all_pager+1)
  66.  
  67. # 构建分页页码的html
  68. page_html_list = []
  69. # 首页
  70. self.params["page"] = 1
  71. first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (
  72. self.params.urlencode(),)
  73. page_html_list.append(first_page)
  74. # 上一页
  75. self.params["page"] = self.current_page - 1
  76. if self.current_page <= 1:
  77. prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
  78. else:
  79. prev_page = '<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),)
  80.  
  81. page_html_list.append(prev_page)
  82. # self.params: ["page":9,"a":1,"b":2]
  83. # 正常展示页码
  84. for i in pagerange:
  85. self.params["page"] = i
  86. if i == self.current_page:
  87. temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
  88. else:
  89. temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
  90. page_html_list.append(temp)
  91. # 下一页
  92. self.params["page"] = self.current_page + 1
  93. if self.current_page >= self.all_pager:
  94. next_page = '<li class="disabled"><a href="#">下一页</a></li>'
  95. else:
  96. next_page = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),)
  97. page_html_list.append(next_page)
  98. # 尾页
  99. self.params["page"] = self.all_pager
  100. last_page = '<li><a href="?%s">尾页</a></li> </ul></nav>' % (self.params.urlencode())
  101. page_html_list.append(last_page)
  102.  
  103. return ''.join(page_html_list)
  104.  
  105. def book_list2(request):
  106.  
  107. book_list= Book.objects.all()
  108. current_page = int(request.GET.get("page", 1))
  109. pagination = Pagination(request,current_page,book_list,per_page_num=10)
  110.  
  111. book_list=book_list[pagination.start:pagination.end]
  112.  
  113. return render(request,'book_list2.html',locals())

视图层代码

模板层全部代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <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">
  8.  
  9. </head>
  10. <body>
  11. <ul>
  12. {% for book in book_list %}
  13. <li>{{ book }}</li>
  14. {% endfor %}
  15.  
  16. </ul>
  17. {{ pagination.page_html|safe }}
  18.  
  19. </body>
  20. </html>

模板层代码

a

WEB框架-Django组件学习-分页器学习的更多相关文章

  1. Python3.5学习十八 Python之Web框架 Django

    Python之Web框架: 本质:Socket 引用wsgiref创建web框架 根据web框架创建过程优化所得: 分目录管理 模板单独目录 执行不同函数单独存入一个方法py文件 Web框架的两种形式 ...

  2. 工作流,WEB框架,UI组件网络收集整理

    工作流,WEB框架,UI组件网络收集整理 在博客园上逛了好多年,随手收录了一些工作流,WEB开发框架,UI组件,现在整理一下与大家分享. 由于个人能力与精力有限,望各位园友在评论中补充,我将全部整理到 ...

  3. python运维开发(十七)----jQuery续(示例)web框架django

    内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...

  4. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  5. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...

  6. 冰冻三尺非一日之寒--web框架Django

    1.JS 正则    test   - 判断字符串是否符合规定的正则        rep = /\d+/;        rep.test("asdfoiklfasdf89asdfasdf ...

  7. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  8. Web框架django基础篇

    基本配置及学习  路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开 ...

  9. 利用python web框架django实现py-faster-rcnn demo实例

    操作系统.编程环境及其他: window7  cpu  python2.7  pycharm5.0  django1.8x 说明:本blog是上一篇blog(http://www.cnblogs.co ...

随机推荐

  1. 【Python3爬虫】下载酷狗音乐上的歌曲

    经过测试,可以下载要付费下载的歌曲(n_n) 准备工作:Python3.5+Pycharm 使用到的库:requests,re,json,time,fakeuseragent 步骤: 打开酷狗音乐的官 ...

  2. JDK源码分析(8)之 Reference 完全解读

    在阅读本文之前最好对 Reference 框架有一个整体的把握,可以参考我上一篇博客 Reference 框架概览 :本文主要讲了 Reference 的子类实现和应用(SoftReference,W ...

  3. 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)

    今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...

  4. Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法

    本篇以实例介绍selenium下的webdriver模块提供的定位页面元素(也可以称为对象)的方法和使用技巧,在此注意:在做WEB自动化测试前,需要对前端相关的技术有所了解,如HTML.XML.Xpa ...

  5. webpack4.0各个击破(4)—— Javascript & splitChunk

    目录 一. Js模块化开发 二. Js文件的一般打包需求 三. 使用webpack处理js文件 3.1 使用babel转换ES6+语法 3.2 脚本合并 3.3 公共模块识别 3.4 代码分割 3.5 ...

  6. 第8章 概述 - Identity Server 4 中文文档(v1.0.0)

    快速入门提供了各种常见IdentityServer方案的分步说明.他们从基础到复杂 - 建议您按顺序完成它们. 将IdentityServer添加到ASP.NET Core应用程序 配置Identit ...

  7. [C#] C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...

  8. asp.net 建多个项目实现三层的实例——读取一张表中的记录条数

    学习asp.net两周,通过学习发现,.net和php之间的区别还是蛮大的,比php要复杂一些,开始学习的有些吃力,后来跟着传智播客里的老师学习,渐渐的学到了一些东西. 今天要记录一下.net里的简单 ...

  9. 原生JS实现简易轮播图

    原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...

  10. Javascript继承3:将优点为我所有----组合式继承

    //声明父类 function ParentClass(name){ //值类型公有属性 this.name = name //引用类型公有属性 this.books = ['Html'] } //父 ...