django的内置分页
本节内容
自定义一个简单的内置分页
Django内置分页
Django内置分页扩展(继承)
自定义内置组件
自定义一个简单的内置分页
先用django自己自定制一个简单的内置分页,大概掌握内置分页的底层原理之后,自己就可以扩展分页。
首先定义每页分页为10,每当用户GET访问 ?p=1 时或其他 只展示10 行数据
然后对原来的数据USER_LIST进行切片,按照用户GET访问定制的p为何值时展示start到end之间的索引值
这里使用了简单的数学公式 ,计算出start和end后再传给render渲染

USER_LIST = []for i in range(1,999): d = {"name":"root"+str(i),"age":i} USER_LIST.append(d)
def index(request): per_page_count = 10 current_page= request.GET.get("p") current_page = int(current_page) start = (current_page-1)*per_page_count end = current_page*per_page_count return render(request,"index.html",{"USER_LIST":USER_LIST[start:end]})

Django内置分页
Paginator(L,10)第一个参数为传入的数据,第二个为每页显示的数据条数
Paginator下封装了许多方法,其中还封装了page对象,page对象下还封装了Paginator对象,可以让page对象再调用回来

from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') paginator = Paginator(L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: posts = paginator.page(current_page) #对当前页进行切片 # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator Paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', {'posts': posts})

Django内置分页扩展(继承)
我们来自定制一个功能:若总页数为100页时,让第11页中间显示 7,8,9,10,11,12,13,14,15
自定制一个CustomPaginator类继承Paginator类就可以自定制一个我们需要的分页组件
在CustomPaginator中我们定义了页数范围:定义页数范围首先分为两种情况
- 总页数特别少时:总页数少于最多可用于显示的页数时——>直接显示总页数
- 总页数特别多时:又分3种情况
总页数特别多时
当前页数处于1,2,3较排头的页数时,没必要让其居中显示——>直接显示 1---最大可用于显示的页数 (区间均为:最大可用于显示的页数)
当前页数特别大,处于排尾的页数,直接显示——> 总页数减去最大可用于显示的页数 ---总页数 (区间均为:最大可用于显示的页数)
当前页数处于中间部分——>当前页数减去最大可用于显示的页数的一半 --- 当前页数加上最大可用于显示的页数的一半 (区间均为:最大可用于显示的页数)

class CustomPaginator(Paginator): def __init__(self, current_page, max_pager_num, *args, **kwargs): """ :param current_page: 当前页 :param max_pager_num:最多显示的页码个数 :param args: :param kwargs: :return: """ self.current_page = int(current_page) self.max_pager_num = max_pager_num super(CustomPaginator, self).__init__(*args, **kwargs) def page_num_range(self): # 当前页面 # self.current_page # 总页数 # self.num_pages # 最多显示的页码个数 # self.max_pager_num print(1) #当总页数少于最多可显示的页码个数时,就直接显示总页数就行 if self.num_pages < self.max_pager_num: return range(1, self.num_pages + 1) print(2) #以下是当前页数特别多的时候的情况 part = int(self.max_pager_num / 2) #当前页数特别小的时候,例如1,2,3。。小于每页可显示的最多页数的一半的时候 if self.current_page - part < 1: return range(1, self.max_pager_num + 1) print(3) #当前页数特别大的时候,接近总页数的时候 if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1) print(4) return range(self.current_page - part, self.current_page + part + 1) L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') paginator = CustomPaginator(current_page, 11, L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', {'posts': posts})

自定义内置组件
html用法 :{ page_obj.page_str|safe }}

class Pagination(object): def __init__(self,totalCount,currentPage,perPageItemNum=30,maxPageNum=7): #数据总个数 self.total_count = totalCount #当前页 try: v = int(currentPage) if v <= 0: self.current_page =1 self.current_page = v except Exception as e: self.current_page = 1 #每页显示的数据数 self.per_page_item_num = perPageItemNum self.max_page_num = maxPageNum def start(self): return (self.current_page-1) * self.per_page_item_num def end(self): return self.current_page * self.per_page_item_num @property def num_pages(self): """ 总页数 :return: """ #数据总个数除于每页显示的行数,得商与余数 a,b = divmod(self.total_count,self.per_page_item_num) if b==0: return a return a+1 def page_num_range(self): print(1) if self.num_pages < self.max_page_num: return range(1, self.num_pages + 1) print(2) part = int(self.max_page_num / 2) if self.current_page - part < 1: return range(1, self.max_page_num+ 1) print(3) if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_page_num, self.num_pages + 1) print(4) return range(self.current_page - part, self.current_page + part + 1) def page_str(self): page_list = [] first = '<li><a href="/index2.html?p=1">首页</a></li>' page_list.append(first) if self.current_page == 1: prev = '<li><a href="#">上一页</a></li>' else: prev = '<li><a href="/index2.html?p=%s">上一页</a></li>' % (self.current_page-1) page_list.append(prev) for i in self.page_num_range(): if i == self.current_page: temp = "<li class ='active'><a href='/index2.html?p=%s' >%s</a></li>"%(i,i) else: temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i) page_list.append(temp) if self.current_page == self.num_pages: nex = '<a href="#">下一页</a>' else: nex = '<a href="/index2.html?p=%s">下一页</a>' % (self.current_page+1) page_list.append(nex) last = '<a href="/index2.html?p=%s">尾页</a>' % self.num_pages page_list.append(last) #列表迭代空格分割拼接 return ''.join(page_list)
django的内置分页的更多相关文章
- Django内置分页
一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...
- Djang内置分页和自定义分页
内置分页 views from django.core.paginator import Paginator,Page,PageNotAnInteger def DJs_pages(request): ...
- django的内置信号
Model singnalspre_init 在model执行构造方法之前自动触发post_init django的model在执行构造方法之后,自动触发pre_save django的对象保存之前, ...
- Django的内置登录、退出、修改密码方法
Django中内置的登录.退出.修改密码方法. 1.url.py中使用django.contrib.auth中的views函数,django.views.generic中的TemplateView函数 ...
- Django 使用 内置 content-type
django内置的content-type组件, 记录了项目中所有model元数据的表 可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id ...
- Django扩展内置User类
内置User类 使用内置User可以方便实现登录验证,利用Admin管理界面还可以方便添加.删除.修改用户. 一个内置的User类定义了以下字段: username: 用户名 password: 密码 ...
- Django 内置分页的简单使用
1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...
- Django 内置分页--Paginator类
官方文档 http://python.usyiyi.cn/django/topics/pagination.html 前端方法 http://www.tuicool.com/articles/RniU ...
- Django,ajax实现表格增删查改,Django内置分页功能。
1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...
随机推荐
- mpt2sas0: log_info(0x31120100): originator(PL), code(0x12), sub_code(0x0100)及同类问题的追踪
做存储或者磁盘阵列的经常会遇到linux kernel打印如下信息或者类似的信息,这是什么原因导致的呢? mpt2sas0: log_info(0x31120100): originator(PL), ...
- navigateTo、redirectTo、switchTap与reLaunch的区别
wx.navigateTo:保留当前页,跳转到指定页,非tabBar:使用 wx.navigateBack 可以返回到当前的页面. wx.redirectTo:关闭当前页,跳转到指定页,非tabBar ...
- python之路——22
学习内容 1.初识面向对象 类:抽象的,模子 对象:具体的,根据类规范 代码精简,修改方便,属性规范2.对象 查看属性 调用方法 __dict__,增删改查,通过字典语法进行3.类名 1.实例化 2. ...
- source Insight 添加python 工程
1. 下载python的识别文件 Python.CLF 2.设置
- 设计模式<1>------单例模式和原型模式------创建型
原文引自:http://www.cnblogs.com/lonelyxmas/p/3720808.html 单例模式 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并 ...
- petapoco模板修改
[Reference(ReferenceType.Many, ColumnName = "OneId", ReferenceMemberName = "OneId&quo ...
- JSP的三个脚本元素
JSP的脚本:JSP定义Java代码的方式 1. <% 代码 %>:[脚本段:java程序段]定义的java代码,在service方法中.service方法中可以定义什么,该脚本中就可以定 ...
- aptitude与apt-get的区别和联系
aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具.与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些.举例来说,aptitud ...
- 域名动态解析到动态IP
一般宽带用户的IP都是动态IP,重连之后IP可能会发生变化. 如果想在其他地方连接家里的设备,或者在家中搭建服务器,就会受到影响. 现在提供一种动态解析域名的方式,只要检测到IP的变化,那么就调用阿里 ...
- scrapy-middlewares
1.scrapy中间件 下载中间件Downloader Middlewares 下载器中间件处理请求与响应,对应两个方法 process_request(self, request, spider) ...