一 django 的分页器

1 批量创建数据

    批量导入数据:

    Booklist=[]
for i in range(100):
Booklist.append(Book(title="book"+str(i),price=30+i*i))
Book.objects.bulk_create(Booklist)

2 分页器的使用

    book_list=Book.objects.all()
paginator = Paginator(book_list, 10) print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表 page1=paginator.page(1) #第1页的page对象
for i in page1: #遍历第1页的所有数据对象
print(i) print(page1.object_list) #第1页的所有数据 page2=paginator.page(2) print(page2.has_next()) #是否有下一页
print(page2.next_page_number()) #下一页的页码
print(page2.has_previous()) #是否有上一页
print(page2.previous_page_number()) #上一页的页码

  抛错

    page=paginator.page(12)   # error:EmptyPage

    page=paginator.page("z")   # error:PageNotAnInteger

3 view

from django.shortcuts import render,HttpResponse

# Create your views here.
from app01.models import *
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger book_list=Book.objects.all() paginator = Paginator(book_list, )
page = request.GET.get('page',)
currentPage=int(page) try:
print(page)
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page()
except EmptyPage:
book_list = paginator.page(paginator.num_pages) return render(request,"index.html",{"book_list":book_list,"paginator":paginator,"currentPage":currentPage})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body> <div class="container"> <h4>分页器</h4>
<ul> {% for book in book_list %}
<li>{{ book.title }} -----{{ book.price }}</li>
{% endfor %} </ul> <ul class="pagination" id="pager"> {% if book_list.has_previous %}
<li class="previous"><a href="/index/?page={{ book_list.previous_page_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %} {% for num in paginator.page_range %} {% if num == currentPage %}
<li class="item active"><a href="/index/?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li> {% endif %}
{% endfor %} {% if book_list.has_next %}
<li class="next"><a href="/index/?page={{ book_list.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %} </ul>
</div> </body>
</html>

提高 弹性显示页码

def index(request):

    book_list=Book.objects.all()

    paginator = Paginator(book_list, 15)
page = request.GET.get('page',1)
currentPage=int(page) # 如果页数十分多时,换另外一种显示方式
if paginator.num_pages>11: if currentPage-5<1:
pageRange=range(1,11)
elif currentPage+5>paginator.num_pages:
pageRange=range(currentPage-5,paginator.num_pages+1) else:
pageRange=range(currentPage-5,currentPage+5) else:
pageRange=paginator.page_range try:
print(page)
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page(1)
except EmptyPage:
book_list = paginator.page(paginator.num_pages) return render(request,"index.html",locals())

二 自定义分页器源码

import copy
class Paginator:
def __init__(self,request,total_count,current_page=1,per_page_data_num=5,show_page_num=11):
self.total_count=total_count #数据总数
self.per_page_data_num=per_page_data_num #每页的数据个数 5
self.show_page_num=show_page_num #显示页面个数 11
self.request=request
self.params=self.get_params
try:
current_page = int(current_page)
if current_page < 1:
self.current_page = 1
elif current_page>self.get_page_num:
self.current_page = 1
else:
self.current_page = current_page
except Exception as e:
self.current_page = 1
self.half_num=self.show_page_num//2 @property
def get_params(self):
params = copy.deepcopy(self.request.GET)
return params @property
def get_page_num(self):
p_num,mod=divmod(self.total_count,self.per_page_data_num)
if mod:
p_num+=1
return p_num @property
def start(self):
return self.per_page_data_num*(self.current_page-1) @property
def end(self):
return self.per_page_data_num*self.current_page def html(self):
page_num_list=[]
# print(self.get_page_num) #页码四种情况配置
if self.get_page_num<self.show_page_num:
show_start=1
show_end=self.get_page_num+1
else:
if self.current_page<=self.half_num:
show_start = 1
show_end = self.show_page_num+1
elif self.current_page + self.half_num >= self.get_page_num:
show_start = self.get_page_num - self.show_page_num + 1
show_end = self.get_page_num + 1
else:
show_start=self.current_page-self.half_num
show_end=self.current_page+self.half_num+1 # 首页
self.params['page']=1
first_page = r'<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' %(self.params.urlencode(),)
page_num_list.append(first_page)
# 上一页
if self.current_page == 1:
previous_num = r'<li class="disabled"><a >上一页</a></li>'
else:
self.params['page'] = self.current_page-1
previous_num = r'<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),)
page_num_list.append(previous_num) #页码显示
for i in range(show_start,show_end):
self.params['page'] = i
if i==self.current_page:
li_num = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
else:
li_num='<li><a href="?%s">%s</a></li>'%(self.params.urlencode(),i,)
page_num_list.append(li_num) # 下一页
if self.current_page == self.get_page_num:
next_num = '<li class="disabled"><a >下一页</a></li>'
else:
self.params['page'] = self.current_page+1
next_num = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),)
page_num_list.append(next_num) # 尾页
self.params['page'] = self.get_page_num
last_page = '<li><a href="?%s">尾页</a></li></ul></nav>' % (self.params.urlencode(),)
page_num_list.append(last_page)
return "".join(page_num_list)

调用方式

from django.shortcuts import render
from app01.models import Book
from page import Paginator def index(request):
#批量创建数据
# book_list=[]
# for i in range(1,101):
# book=Book(title="书籍%s"%(i,),price=random.randint(50,300))
# book_list.append(book)
# Book.objects.bulk_create(book_list)
data_list=Book.objects.all()
current_page=request.GET.get('page')
paginator=Paginator(request,total_count=data_list.count(),current_page=current_page)
data_list=data_list[paginator.start:paginator.end]
return render(request,'index.html',{"data_list":data_list,"paginator":paginator})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head>
<body>
<ul>
{#数据显示#}
{% for data in data_list %}
<li>{{ data.title }}----{{ data.price }}</li>
{% endfor %}
</ul>
{#页码显示#}
{{ paginator.html|safe }}
</body>
</html>

django自定义分页器的更多相关文章

  1. Django 自定义分页器

    为什么要实现分页? 在大部分网站中分页的功能都是必要的,尤其是在后台管理中分页更是不可或缺 分页能带给用户更好的体验,也能减轻服务器的压力 对于分页来说,有许多方法都可以实现 例如把数据全部读取出来在 ...

  2. Django分页器和自定义分页器

    一.自定义分页器 import copy class Pagination(): def __init__(self,request,current_page,all_data_num,each_pa ...

  3. Django分页器及自定义分页器

    Django的分页器 view from django.shortcuts import render,HttpResponse # Create your views here. from app0 ...

  4. Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数

    Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...

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

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

  6. django中的自定义分页器

    1.什么是自定义分页器 当我们需要在前端页面展示的数据太多的时候,我们总不能将数据展示在一页上面吧!这时,我们就需要自定义一个分页器,将数据分成特定的页数进行展示,每一页展示固定条数的数据! 2.为什 ...

  7. Python自定义-分页器

    Python自定义-分页器 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3 ...

  8. Django组件——分页器和中间件

    分页器 Django内置分页器(paginator) 分页器函数为paginator,里面有几个重要的参数需要我们了解 paginator = Paginator(book_list, 10) #第二 ...

  9. Django 进阶(分页器&中间件)

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...

随机推荐

  1. AspNetCore 文件上传(模型绑定、Ajax) 两种方式 get到了吗?

    就目前来说,ASP.NET Core2.1了,已经相当成熟了,希望下个项目争取使用吧!! 上传文件的三种方式("我会的,说不定还有其他方式") 模型绑定 Ajax WebUploa ...

  2. 小技巧,把Markdown文本发布到微信公众号文章

    估计很多人都是这样,平常工作在github,等到有成果要发布,又要写微信公众号. github用Markdown,微信公众号,至少截止今天,还是沿用富文本的方式.不是说富文本不好,但每次精心撰写的内容 ...

  3. SpringBoot入门教程(十三)CORS方式实现跨域

    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资 ...

  4. 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...

  5. 前端笔记之JavaScript(六)让人头疼的正则表达式

    一.正则表达式 1.1正则概述和体验 正则表达式是被用来匹配字符串中的字符组合的模式,常用来做表单验证.在JavaScript中,正则表达式也是对象,是一种引用类型. 案例:正确输入一个电话号码,01 ...

  6. PC逆向之代码还原技术,第五讲汇编中乘法的代码还原

    目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...

  7. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能

    不管是什么系统登录用户都有忘记密码的时候,忘记密码就进入不了系统.系统应该可以提供重置用户密码的功能.在我们框架中重置用户密码功能一般用用户管理员来完成.当然如果做得复杂点还可以由用户自己来重置(如: ...

  8. Docker 网络之进阶篇

    笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...

  9. Docker最全教程——从理论到实战(一)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...

  10. 老王说JavaDoc

    开场白说点东西: { 抓住客户的痛点.痒点.爽点,提出我们产品的核心价值. 产品定位 技术架构 以微服务为核心的前后端分离,业务积木装配式技术架构.传感器采集,物联网+互联网转换,大数据分布式.存储. ...