django基础之day08,分页器从无到有,动态思路解析全过程
*********分页器从无到有的全过程,动态思路解析如下:********
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">«</span>
</a>
</li>
{{ html|safe }}
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
django基础之day08,分页器从无到有,动态思路解析全过程的更多相关文章
- django基础之day08,ajax结合sweetalert的使用
models.py文件 from django.db import models class User(models.Model): username=models.CharField(max_len ...
- Django基础之自定义分页器
自定义分页器 针对批量插入的数据,我们在前端展示的时候发现一个很严重的问题,一页展示了所有的数据,数据量太大,查看不方便 针对数据量大但又需要全部展示给用户观看的情况下,我们统一做法都是做分页处理 分 ...
- django基础之day08,利用bulk_create 批量插入成千上万条数据
bulk_create批量插入数据 models.py文件 class Book(models.Model): title=models.CharField(max_length=32) urls.p ...
- Django基础之命名URL和URL反向解析
在使用Django项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等). 人们强烈希望不要硬编码这些URL(费力 ...
- Django 基础教程
Django 基础教程 这是第一篇 Django 简介 » Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单 ...
- python的django基础篇
一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...
- Python学习(二十六)—— Django基础一
转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...
- Django基础(一)
Django基础(一) 知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即f ...
- python3之Django基础篇
一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...
随机推荐
- 标准库bufio个人详解
本文是我有通俗的语言写的如果有误请指出. 先看bufio官方文档 https://studygolang.com/pkgdoc文档地址 主要分三部分Reader.Writer.Scanner 分别是读 ...
- SQL查询优化实践
为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时 ...
- jQuery学习笔记3
* 动画效果 * 在一定的时间内, 不断改变元素样式 * slideDown()/slideUp()/slideToggle() * fadeOut()/fadeIn()/fadeToggle() * ...
- spring日志体系浅析(spring 5.x)
日志是进行软件开发必不可少的一项功能,目前流行着很多开源日志库,比如log4j.log4j2.logback.JDK Logging.commons-logging.slf4j等. 几种日志产品的介绍 ...
- Spring项目中优雅的异常处理
前言 如今的Java Web项目多是以 MVC 模式构建的,通常我们都是将 Service 层的异常统一的抛出,包括自定义异常和一些意外出现的异常,以便进行事务回滚,而 Service 的调用者 Co ...
- 你真的了解Object源码吗
欢迎点赞阅读,一同学习交流,有疑问请留言 . GitHub上也有开源 JavaHouse 欢迎star 引入 Object 应该是比较简单的源码了.现在我们来分析一下他.Object 是类层次结构的根 ...
- mysql 安装报错集合
mysql-5.6.39 源码编译安装报错 报错信息: /tmp/ccV858jD.s: Assembler messages: /tmp/ccV858jD.s: Fatal error: can't ...
- 英语口语考试资料Food
新东方推荐文章:Food and Health The food we eat seems to have profound effects on our health. Although scien ...
- Docker虚拟化之<基础理论>
1.虚拟化技术的概念 (1)虚拟化技术主要是将物理的资源转变为逻辑上可以管理的资源,以打破物理结构上的壁垒,让计算元件运行在虚拟的基础上,而不是真实的物理资源上.(2)虚拟化技术的底层是要进行虚拟化的 ...
- Mac从拆箱到入门
Mac从拆箱到入门 记录首次使用Mac的我的历程,不是专业的Mac使用教程,只是简单的记录.还有我在使用过程中一些用到的功能都一些小提示吧. 1.首次开机配置,对于一个完全的新手来说(也就是我) ...