1.分页:
Paginator对象
Page对象
2.Paginator:
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
Required arguments:
- object_list
- per_page  每页显示多少条
Optional arguments:
- orphans
- allow_empty_Òrst_page
属性:
- Paginator.count 所有页面的objects总数
- Paginator.num_pages 页面总数
- Paginator.page_range 页码的范围,从1开始,例如[1, 2, 3, 4]
方法:
- Paginator.page(number) 返回一个page对象,number, 当前显示的是第几页
 
3.Page:
class Page(object_list, number, paginator)
属性:
- Page.object_list 当前页面的对象列表
- Page.number 当前页的序号,从1开始
- Page.paginator Paginator对象
方法
- Page.has_next() 如果有下一页,返回True
- Page.has_previous() 如果有上一页,返回 True
- Page.has_other_pages() 如果有上一面或下一页,返回True
- Page.next_page_number() 返回下一页的页码。如果不存在,抛出InvalidPage异常
- Page.previous_page_number() 返回上一页的页码。如果不存在,抛出InvalidPage异常
- Page.start_index() 返回当前页上的第一个对象,相对于分页列表的所有对象的序号
- Page.end_index() 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号

1.小案例:一次建立1000个用户:
(python36env) [vagrant@CentOS7 devops]$ python manage.py shell

In [1]: from django.contrib.auth.models import User

In [2]: username = "rock"

In [3]: for i in range(1000):
...: name = "{}_{}".format(username, i)
...: User.objects.create_user(name, "{}@51reboot.com".format(name), "123456")

2.查询用户

In [2]: User.objects.all()   查询出所有用户/只是不会全列完

In [3]: User.objects.all()[:10] 前十条

In [4]: queryset = User.objects.all()[:10]  -->1.取数据

In [5]: queryset.values()   这样就可把所有的数据转换出来如下图

In [10]: queryset.values("username", "email")    --->2.取部分字段
<QuerySet [{'username': 'devops', 'email': '123@qq.com'}, {'username': 'rock', 'email': 'rock@51reboot.com'}, {'username': 'rock_0', 'email': 'rock_0@51reboot.com'},。。。。。}]>

In [11]: list(queryset.values("username", "email"))   --->3.转换成json(这样的数据可直接给httpresponse对象)再返回给浏览器
Out[11]:
[{'username': 'devops', 'email': '123@qq.com'},
{'username': 'rock', 'email': 'rock@51reboot.com'},
{'username': 'admin', 'email': 'admin@51reboot.com'},
{'username': 'rock_0', 'email': 'rock_0@51reboot.com'},

3.我要的是在前端传第几页?page参数就能返回第几页的数据:

1.拿到page => str类型  要转int

2.获取数据:

  User.objects.all()

3.对数据进行处理,分页--根据传的page值来计算切片的开头和结尾:

  queryset = User.objects.all()[start:end]

4.转json:

  ret = list(queryset.values("id","username","email"))

5.返回httpresponse对象:

views.py中:

from django.views import View
class MyView(View):
def get(self,request,*args,**kwargs):
per = 10
try:#转的过程可能会出错如果出错就让page等于1
page = int(request.GET.get("page",1))
except:
page = 1
end = page * 10
start = end - 10
queryset = User.objects.all()[start:end]
data = list(queryset.values("id","username","email"))
return JsonResponse(data, safe=False)

dashboard/urls.py中:

from django.conf.urls import include, url
from .views import MyView
urlpatterns = [
url(r'^hello/', MyView.as_view()),
]

启动效果如图:

4.分页面展示出提示搜索结果有多少条记录/共有多少页/下上一页/首页/尾页---paginator对象

https://devdocs.io/   神奇的文档网,可以在此参考

(python36env) [vagrant@CentOS7 devops]$ python manage.py shell
In [13]: queryset = User.objects.all()
In [14]: from django.core.paginator import Paginator
In [15]: paginator = Paginator(queryset, 10) 实例化对象
In [16]: paginator.count 总共有多少条
Out[16]: 1003
In [17]: paginator.num_pages 总共有多少页
Out[17]: 101
In [18]: paginator.page_range 页码范围
Out[18]: range(1, 102)

In [19]: page = paginator.page(10)  #实例化page对象当前页是第十页

In [20]: page.number
Out[20]: 10

In [21]: page.next_page_number()
Out[21]: 11

七.数据分页原理,paginator与page对象的更多相关文章

  1. 15 ~ express ~ 用户数据分页原理和实现

    一,在后台路由 /router/admin.js 中 1,限制获取的数据条数 : User.find().limit(Number) 2,忽略数据的前(Number)条数据 : skip(Number ...

  2. ThinkPHP数据分页Page.class.php

    获取分页类 ThinkPHP提供了数据分页的扩展类库Page,能够在http://www.thinkphp.cn/extend/241.html下载,或者下载官方的完整扩展包(http://www.t ...

  3. 在pycharm中批量插入表数据、分页原理、cookie和session介绍、django操作cookie

    昨日内容回顾 ajax发送json格式数据 ''' 1. urlencoded 2. form-data 3. json ''' 1. ajax $.ajax({ data: JSON.stringi ...

  4. Mybatis的分页插件PageHelp:Page对象中的pageSize等属性无法序列化,无法转换为json字符串

    Page<User> page = new Page<>();        User user = new User();        user.setAge(20);   ...

  5. django orm 分页(paginator)取数据出现警告manage.py:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'sign.models.Guest'> QuerySet.

    使用django的orm做分页(Paginator)时出现了下面的警告 In [19]: p=Paginator(guest_list,2) manage.py:1: UnorderedObjectL ...

  6. 使用Puppeteer进行数据抓取(二)——Page对象

    page对象是puppeteer最常用的对象,它可以认为是chrome的一个tab页,主要的页面操作都是通过它进行的.Google的官方文档详细介绍了page对象的使用,这里我只是简单的小结一下. 客 ...

  7. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  8. Django——分页功能Paginator

    Django分页功能----Paginator Paginator所需参数: Paginator(object_list,per_page) Paginator常用属性: per_page: 每页显示 ...

  9. Django分页组件——Paginator

    from django.core.paginator import Paginator #导入Paginator objects = ['john','paul','george','ringo',' ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法提高 传染病控制

    算法提高 传染病控制 时间限制:1.0s 内存限制:512.0MB 问题描述 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的 ...

  2. java算法集训代码填空题练习2

    1 连续数的公倍数 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4, ...

  3. java实现蓝桥杯约瑟夫环

    n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数. (报数是从1报起)当报到 k 的时候,这个人就退出游戏圈.下一个人重新从1开始报数. 求最后剩下的人的编号 ...

  4. java实现第六届蓝桥杯饮料换购

    饮料换购 饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么, ...

  5. Linux 日志轮替

    日志轮替包括两个方面的内容:切割日志文件,轮换日志文件 日志文件的命令规则 如果配置文件中有dateext参数,那么日志文件的后缀会是日期,例如:yum.log-20200424,这样,文件名不会重叠 ...

  6. 【JVM故事】一个Java字节码文件的诞生记

    万字长文,完全虚构. (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李大胖也在心里开导自己,学生嘛,不能要求太高,只要肯上进,慢慢来.就称呼为小白吧. ...

  7. 阿里云杨敬宇:边缘计算行业通识与阿里云ENS的技术演进之路

    近日,阿里云杨敬宇在CSDN阿里云核心技术竞争力在线峰会上进行了<5G基础设施-阿里云边缘计算的技术演进之路>主题演讲,针对5G时代下,行业和技术的趋势.边缘计算产业通识以及阿里云边缘计算 ...

  8. centos6.5 安装 clickhouse

    概述:clickhouse是一个高性能的列式数据库,特点就是快快快,查询性能是mysql的100-1000倍,非常适合存储频繁写入的数据,比如:日志,用户事件记录.单表存储上亿甚至十几亿行数据库查询都 ...

  9. 分享一个springboot脚手架

    项目介绍 在我们开发项目的时候各个项目之间总有一些可共用的代码或者配置,如果我们每新建一个项目就把代码复制粘贴再修改就显得很没有必要.于是我就做了一个 poseidon-boot-starter 该项 ...

  10. @codeforces - 594E@ Cutting the Line

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个字符串 s 与正整数 k.现在你需要进行恰好一次操作: ...