1. *********分页器从无到有的全过程,动态思路解析如下:********
  2. 1.通过book_queryset = models.Book.objects.all()[start_num:end_num]
  3. 获取到用户在Book表中的所有数据,通过切片操作,获取用户的起始位数和终止位数
  4. 2.通过get请求方式,获取用户当前在第几页,current_page,默认在第一页
  5. 3.定义每页展示的条数pagenum=10
  6. 获得三者之间的对应关系:
  7. startnum = (current_page-1) * pagenum
  8. endnum = currentpage * pagenum
  9. 4.遇到问题,用户想要哪一页不能自己手动选择,我们只写死了5页的数据,
  10. 不够符合业务需求,此时我们想到了要加一个分页器,在底部放置。
  11. 5.下面开始了分组的逻辑运算;
  12. 5.1我们先要获取到数据表中总共有多少条数据
  13. 5.2计算出来数据表中数据的总条数
  14. 5.3通过all_page_num,more = divmod(总条数,每页数量),进行解压赋值操作
  15. [divmod(a,b)方法可以用来查看所需要的分组是多少]
  16. 5.4 if more != 0: #此处也可以写成if more:代表有值,老师的写法
  17. 获取到了总共的页码数量:all_page_num +=1
  18. 5.5后端通过空字符串:html=''
  19. 循环总页码all_page_num次:for i in range(all_page_num):
  20. 这样html字符串进行连续的拼接:html += '<li><a href="?page=%s">%s</a></li>'%(i,i)
  21. 5.6然后通过渲染方法,把后端代码html字符串渲染到前端页面上,
  22. 通过safe模式{{ html|safe }}渲染代码,安全打开。
  23. 6.但是此时我们还是会遇到一个问题,就是把所有的页码全部展示出来了,
  24. 不符合用户规范和使用的需求,那么我们下一步该如何进行优化呢?
  25. 6.1我们想要一共展示11位的页码,我们采取
  26. for循环当前页-5页和当前页+5页的一个范围,作为此次的改进,
  27. html=''
  28. for i in range(current_page-5,current_page+5):
  29. html += '<li><a href="?page=%s">%s</a></li>'%(i,i)
  30. 6.2高亮显示用户选择的页码,怎么做呢?
  31. 思路:
  32. 1.判断用户当前的页码(浏览器url地址中的页码:current_page 变量)
  33. 和点击的页面页码是否相等 (鼠标移动的页面页码:i 变量)
  34. 如果两者相等:<li>标签中加入class="active"
  35. 两者不相等,<li>标签中不加入。
  36. 2.页码必须从1开始,该如何设置呢?
  37. 思路:举例子即可,当前页current_page赋值给变量XXX
  38. 例如当前页current_page是第三页,第三页小于6,那么变量XXX=6
  39. 程序往下继续执行,循环范围依然是从6-5=1开始,到11结束。
  40. html='' #空字符串
  41. xxx=current_page
  42. if current_page < 6:
  43. xxx=6
  44. # 改进为采取for循环当前页-5页和当前页+5页的一个范围
  45. for i in range(xxx-5,xxx+6): #顾头不顾尾,所以右边取到6
  46. if current_page == i:
  47. #这样html字符串进行连续的拼接
  48. html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
  49. else:
  50. html += '<li><a href="?page=%s">%s</a></li>'%(i,i)
  51. ********************************************************************************************************************
  52. 代码如下代码如下
  53. ********************************************************************************************************************
  54. models.py文件
  55. #批量插入数据,制作分页器作业
  56. class Book(models.Model):
  57. title=models.CharField(max_length=32)
  58. def __str__(self):
  59. return self.title
  60. urls.py文件
  61. from django.conf.urls import url
  62. from django.contrib import admin
  63. from app01 import views
  64. urlpatterns = [
  65. url(r'^admin/', admin.site.urls),
  66. #首页
  67. url(r'^$', views.home),
  68. #访问该url就会往book表中插入1000条数据
  69. url(r'^index/', views.index),
  70. ]
  71. views.py文件
  72. def index(request):
  73. # 定义一页展示的条数
  74. per_page_num=10
  75. #拿出来数据表中所有的数据
  76. book_queryset = models.Book.objects.all()
  77. #计算出来数据表中数据的总条数
  78. all_count=book_queryset.count()
  79. #通过divmod(总数,每页数量)获得需要的总页码,进行解压赋值操作
  80. # [divmod()方法可以用来查看所需要的分组是多少]
  81. all_page_num,more=divmod(all_count,per_page_num)
  82. # 用户查看的当前页码,默认为第一页,下面是三个变量之间的关系
  83. current_page = request.GET.get('page', 1) # 当前页
  84. current_page = int(current_page)
  85. start_num = (current_page - 1) * per_page_num
  86. end_num = current_page * per_page_num
  87. if more != 0: #此处也可以写成if more:代表有值的条件
  88. #获取到了总共的页码数量
  89. all_page_num +=1
  90. html='' #空字符串
  91. xxx=current_page
  92. if current_page < 6:
  93. xxx=6
  94. # 改进为采取for循环当前页-5页和当前页+5页的一个范围
  95. for i in range(xxx-5,xxx+6): #顾头不顾尾,所以右边取到6
  96. if current_page == i:
  97. #这样html字符串进行连续的拼接
  98. html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
  99. else:
  100. html += '<li><a href="?page=%s">%s</a></li>'%(i,i)
  101. #对数据表中的数据进行切分操作
  102. book_queryset=book_queryset[start_num:end_num]
  103. return render(request,'index.html',locals())
  104. index.html文件
  105. <!DOCTYPE html>
  106. <html lang="en">
  107. <head>
  108. <meta charset="UTF-8">
  109. <title>index页面批量插入数据作业</title>
  110. <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
  111. <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
  112. <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
  113. </head>
  114. <body>
  115. <div class="container-fluid">
  116. <div class="row">
  117. <div class="col-md-8 col-md-offset-2">
  118. {% for book in book_queryset %}
  119. <p>{{ book.title }}</p>
  120. {% endfor %}
  121. <nav aria-label="Page navigation">
  122. <ul class="pagination">
  123. <li>
  124. <a href="#" aria-label="Previous">
  125. <span aria-hidden="true">&laquo;</span>
  126. </a>
  127. </li>
  128. {{ html|safe }}
  129. <li>
  130. <a href="#" aria-label="Next">
  131. <span aria-hidden="true">&raquo;</span>
  132. </a>
  133. </li>
  134. </ul>
  135. </nav>
  136. </div>
  137. </div>
  138. </div>
  139. </body>
  140. </html>

django基础之day08,分页器从无到有,动态思路解析全过程的更多相关文章

  1. django基础之day08,ajax结合sweetalert的使用

    models.py文件 from django.db import models class User(models.Model): username=models.CharField(max_len ...

  2. Django基础之自定义分页器

    自定义分页器 针对批量插入的数据,我们在前端展示的时候发现一个很严重的问题,一页展示了所有的数据,数据量太大,查看不方便 针对数据量大但又需要全部展示给用户观看的情况下,我们统一做法都是做分页处理 分 ...

  3. django基础之day08,利用bulk_create 批量插入成千上万条数据

    bulk_create批量插入数据 models.py文件 class Book(models.Model): title=models.CharField(max_length=32) urls.p ...

  4. Django基础之命名URL和URL反向解析

    在使用Django项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等). 人们强烈希望不要硬编码这些URL(费力 ...

  5. Django 基础教程

    Django 基础教程 这是第一篇 Django 简介 »  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单 ...

  6. python的django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  7. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  8. Django基础(一)

    Django基础(一) 知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即f ...

  9. python3之Django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

随机推荐

  1. 排错:golang运行http服务器直接挂掉无错误提示

    一运行就退出一运行就退出,没有报错提示检查代码也没有问题. 代码也没问题,原来是端口被占用了,改成8888就正常了

  2. SpringCloud Alibaba微服务实战 - 基础环境准备

    Springcloud Aibaba现在这么火,我一直想写个基于Springcloud Alibaba一步一步构建微服务架构的系列博客,终于下定决心从今天开始本系列文章的第一篇 - 基础环境准备. 该 ...

  3. yum运行报错:/usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks

    是因为yum动态库使用了新安装libcurl库导致的.使用ldd查看动态库依赖关系: ldd /usr/lib64/python2.7/site-packages/pycurl.so 删除动态库配置中 ...

  4. Fragment事务管理源码分析

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/53132952 本文出自: [HansChen的博客] 概述 在Fragment使用中 ...

  5. oracle查询练习

    1成绩表score如下,查询出每门课都大于80分的学生姓名 准备数据 -建表- SQL> create table score(   2  name varchar(50),   3  kech ...

  6. 程序员的算法课(19)-常用的图算法:最短路径(Shortest Path)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  7. NER

    写在前面:在初学nlp时的第一个任务——NER,尝试了几种方法,cnn+crf.lstm+crf.bert+lstm+crf,毫无疑问,最后结果时Bert下效果最好. 1.关于NER: NER即命名实 ...

  8. js基础-函数-var和let的区别

    javaScript简介 javaScript历史 1995年,Netscape公司是凭借Navigator浏览器成为当时第一代互联网公司. 网景公司希望在HTML界面上加一点动态效果,于是叫Bren ...

  9. 大白话OSI七层协议

    目录 一.物理层 二.数据链路层 2.1 以太网协议 2.2 Mac地址 2.3 广播地址 三.网络层 3.1 IP协议详解 3.1.1 IP地址的两部分 3.2 子网掩码详解 3.3 IP数据包详解 ...

  10. 如何重置IE浏览器

    1.退出所有程序,包括 Internet Explorer.单击“开始”.在“开始搜索”框中键入 inetcpl.cpl 命令,然后按回车键打开“Inetnet 选项”对话框. 2.单击“高级”选项卡 ...