*********分页器从无到有的全过程,动态思路解析如下:******** 1.通过book_queryset = models.Book.objects.all()[start_num:end_num]
获取到用户在Book表中的所有数据,通过切片操作,获取用户的起始位数和终止位数 2.通过get请求方式,获取用户当前在第几页,current_page,默认在第一页
3.定义每页展示的条数pagenum=10
获得三者之间的对应关系:
startnum = (current_page-1) * pagenum
endnum = currentpage * pagenum 4.遇到问题,用户想要哪一页不能自己手动选择,我们只写死了5页的数据,
不够符合业务需求,此时我们想到了要加一个分页器,在底部放置。 5.下面开始了分组的逻辑运算;
5.1我们先要获取到数据表中总共有多少条数据
5.2计算出来数据表中数据的总条数
5.3通过all_page_num,more = divmod(总条数,每页数量),进行解压赋值操作
[divmod(a,b)方法可以用来查看所需要的分组是多少]
5.4 if more != 0: #此处也可以写成if more:代表有值,老师的写法
获取到了总共的页码数量:all_page_num +=1 5.5后端通过空字符串:html=''
循环总页码all_page_num次:for i in range(all_page_num):
这样html字符串进行连续的拼接:html += '<li><a href="?page=%s">%s</a></li>'%(i,i) 5.6然后通过渲染方法,把后端代码html字符串渲染到前端页面上,
通过safe模式{{ html|safe }}渲染代码,安全打开。 6.但是此时我们还是会遇到一个问题,就是把所有的页码全部展示出来了,
不符合用户规范和使用的需求,那么我们下一步该如何进行优化呢?
6.1我们想要一共展示11位的页码,我们采取
for循环当前页-5页和当前页+5页的一个范围,作为此次的改进,
html=''
for i in range(current_page-5,current_page+5):
html += '<li><a href="?page=%s">%s</a></li>'%(i,i) 6.2高亮显示用户选择的页码,怎么做呢?
思路:
1.判断用户当前的页码(浏览器url地址中的页码:current_page 变量)
和点击的页面页码是否相等 (鼠标移动的页面页码:i 变量)
如果两者相等:<li>标签中加入class="active",
两者不相等,<li>标签中不加入。
2.页码必须从1开始,该如何设置呢?
思路:举例子即可,当前页current_page赋值给变量XXX,
例如当前页current_page是第三页,第三页小于6,那么变量XXX=6,
程序往下继续执行,循环范围依然是从6-5=1开始,到11结束。 html='' #空字符串
xxx=current_page
if current_page < 6:
xxx=6
# 改进为采取for循环当前页-5页和当前页+5页的一个范围
for i in range(xxx-5,xxx+6): #顾头不顾尾,所以右边取到6
if current_page == i:
#这样html字符串进行连续的拼接
html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
else:
html += '<li><a href="?page=%s">%s</a></li>'%(i,i) ********************************************************************************************************************
代码如下代码如下
******************************************************************************************************************** models.py文件 #批量插入数据,制作分页器作业
class Book(models.Model):
title=models.CharField(max_length=32) def __str__(self):
return self.title urls.py文件 from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#首页
url(r'^$', views.home),
#访问该url就会往book表中插入1000条数据
url(r'^index/', views.index), ] views.py文件 def index(request):
# 定义一页展示的条数
per_page_num=10
#拿出来数据表中所有的数据
book_queryset = models.Book.objects.all()
#计算出来数据表中数据的总条数
all_count=book_queryset.count()
#通过divmod(总数,每页数量)获得需要的总页码,进行解压赋值操作
# [divmod()方法可以用来查看所需要的分组是多少]
all_page_num,more=divmod(all_count,per_page_num)
# 用户查看的当前页码,默认为第一页,下面是三个变量之间的关系
current_page = request.GET.get('page', 1) # 当前页
current_page = int(current_page)
start_num = (current_page - 1) * per_page_num
end_num = current_page * per_page_num if more != 0: #此处也可以写成if more:代表有值的条件
#获取到了总共的页码数量
all_page_num +=1 html='' #空字符串
xxx=current_page
if current_page < 6:
xxx=6
# 改进为采取for循环当前页-5页和当前页+5页的一个范围
for i in range(xxx-5,xxx+6): #顾头不顾尾,所以右边取到6
if current_page == i:
#这样html字符串进行连续的拼接
html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
else:
html += '<li><a href="?page=%s">%s</a></li>'%(i,i) #对数据表中的数据进行切分操作
book_queryset=book_queryset[start_num:end_num]
return render(request,'index.html',locals()) index.html文件 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index页面批量插入数据作业</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
{% for book in book_queryset %} <p>{{ book.title }}</p> {% endfor %}
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{{ html|safe }}
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</nav> </div>
</div> </div>
</body>
</html>

最新文章

  1. ubuntu apt-get 时 Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
  2. C3属性的轮播图(持续更新)
  3. IIS:连接数、并发连接数
  4. HBase读写路径的工作机制
  5. 判断文件夹下是否存在txt格式的文本文件
  6. Android实现AppWidget、Broadcast动态注册
  7. ulimit 命令
  8. 【规律】【贪心】【数学】HDU 5573 Binary Tree
  9. AJAX实现无刷新验证用户名
  10. Lucene基础(2)
  11. jqgrid的外观重绘
  12. dotnet core 2.0在ubuntu下安装失败
  13. CentOS5 可用yum源
  14. display为inline-block的元素有内容和没有内容情况下高度不一致的问题
  15. MyBatis基础:MyBatis动态SQL(3)
  16. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)
  17. HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】
  18. lavarel mongo 操作
  19. 无法使用备份文件 &#39;D:\20160512.bak&#39;,因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4096
  20. 【JMeter】JMeter如何输出测试报告

热门文章

  1. leetcode105 从前序与中序遍历序列构造二叉树
  2. 一图读懂Spring Core,Spring MVC, Spring Boot,Spring Cloud 的关系与区别
  3. Spring Cloud报错Error creating bean with name &#39;requestMappingHandlerMapping&#39;
  4. Linux目录结构-中部
  5. 【Android - 自定义View】之自定义View浅析
  6. 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录
  7. 一条数据的HBase之旅,简明HBase入门教程4:集群角色
  8. Android多线程之(一)——View.post()篇
  9. 一文搞懂V8引擎的垃圾回收
  10. Mysql的查询语句的使用