分页

1.简单分页

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index.html$', views.index),
]

project/urls.py

from django.shortcuts import render,HttpResponse,redirect

USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) def index(request):
per_page_count = 10
current_page = request.GET.get('p')
current_page = int(current_page)
#p=1 索引 0,10 0-9
#p=2 索引10,20 10-19
start = (current_page-1) * per_page_count
end = (current_page) * per_page_count
data = USER_LIST[start:end]
prev_page = current_page -1
next_page = current_page +1
return render(request,'index.html',{'user_list':data,'prev_page':prev_page,'next_page':next_page})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for row in user_list %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul> <a href="/index.html?p={{ prev_page }}">上一页</a>
<a href="/index.html?p={{ next_page }}">下一页</a>
</body>
</html>

templates/index.html

展示效果:

2.django内置分页

传入:
- 所有数据
- 当前页
- 每页显示10条
- 最多页面11个

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index1.html$', views.index1),
]

project/urls.py

from django.shortcuts import render,HttpResponse,redirect
from django.core.paginator import EmptyPage, Paginator,PageNotAnInteger USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) #django内置分页
def index1(request):
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
current_page = request.GET.get('p')
#paginator对象
paginator = Paginator(current_page,11,USER_LIST,10) #每页10条数据
try:
posts = paginator.page(current_page)
#age对象
# 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,'index1.html',{'posts':posts})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for row in posts.object_list %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% include 'include/pager.html' %} </body>
</html>

templates/index1.html

{% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="#">下一页</a>
{% endif %} <apan>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</apan>

temlplates/include/pager.html

展示效果:

扩展内置分页:

from django.shortcuts import render,HttpResponse,redirect
from django.core.paginator import EmptyPage, Paginator,PageNotAnInteger USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) class CustomPaginator(Paginator):
def __init__(self, current_page,per_page_number,*args, **kwargs):
#当前页
self.current_page = int(current_page)
#最多显示页码数11
self.per_page_number = int(per_page_number)
super(CustomPaginator, self).__init__(*args, **kwargs) def page_num_range(self):
# self.current_page 当前页
# self.per_page_number 最多显示页码数11
# self.num_pages 总页数
if self.num_pages < self.per_page_number: # 总页数<11
return range(1,self.num_pages+1) # 遍历(1,总页数+1)
part = int(self.per_page_number/2)
if self.current_page <= part: # 当前页 <= 5
return range(1,self.per_page_number+1) # 遍历(1,11+1)
if (self.current_page+part) >= self.num_pages: #当前页+5 >=总页数
return range(self.num_pages-self.per_page_number,self.num_pages+1) # 遍历(总页数-11,总页数+1)
return range(self.current_page-part,self.current_page+part+1) #django内置分页
def index1(request):
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
current_page = request.GET.get('p')
#paginator对象
paginator = CustomPaginator(current_page,11,USER_LIST,10) #每页10条数据
try:
posts = paginator.page(current_page)
#age对象
# 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,'index1.html',{'posts':posts})

app01/views.py #扩展

{% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% for i in posts.paginator.page_num_range %}
{% if i == posts.number %}
<a style="font-size: 30px" href="/index1.html?p={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1.html?p={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="#">下一页</a>
{% endif %} <apan>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</apan>

temlplates/include/pager.html #扩展

效果展示:

3,自定制分页

传入:
- 所有数据个数
- 当前页
- 每页显示10条
- 最多页面11个

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index2.html$', views.index2),
]

project/views.py

def index2(request):
from app01.pager import Pagination
# 传入:
# - 所有数据的个数
# - 当前页
# - 每页显示30条
# - 最多页面7个
current_page = request.GET.get('p')
page_obj = Pagination(666, current_page)
data_list = USER_LIST[page_obj.start():page_obj.end()]
return render(request, 'index2.html', {'data': data_list, 'page_obj': page_obj})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"/>
</head>
<body> <ul>
{% for row in data %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% for i in page_obj.page_num_range %}
<a href="/index2.html?p={{ i}}">{{ i }}</a>
{% endfor %}
<hr/> <ul class="pagination pagination-sm">
{{ page_obj.page_str|safe }}
</ul>
<div style="height: 300px"></div> </body>
</html>

templates/index2.html

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:daly class Pagination(object):
def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7):
self.total_count= totalCount #数据总个数
try:
v = int(currentPage) #当前页
if v <= 0:
v = 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):
#总页数
a,b = divmod(self.total_count,self.per_page_item_num)
if b == 0:
return a
return a + 1 def page_num_range(self):
# self.current_page 当前页
# self.max_page_num 最多显示页码数
# self.num_pages 总页数
if self.num_pages < self.max_page_num:
return range(1,self.num_pages+1)
part = int(self.max_page_num/2)
if self.current_page <= part:
return range(1,self.max_page_num+1)
if (self.current_page+part) >= self.num_pages:
return range(self.num_pages-self.max_page_num,self.num_pages+1)
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:
perv = "<li><a href='#'>上一页</a></li>"
else:
perv = "<li><a href='/index2.html?p=%s'>上一页</a></li>" %(self.current_page-1,)
page_list.append(perv) 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 = "<li><a href='#'>下一页</a></li>"
else:
nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
page_list.append(nex) last = "<li><a href='/index2.html?p=%s'>尾页</a></li>"%(self.num_pages,)
page_list.append(last) return ''.join(page_list)

app01/pager.py

展示效果:

【django】分页的更多相关文章

  1. django 分页(2) 使用类 页码显示

    django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...

  2. Django 分页功能

    Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...

  3. 原生的 django 分页

    原始的 django 分页 # 基本 写法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, ...

  4. django 分页组件

      一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...

  5. Django分页(二)

    Django分页(二) 要求 .设定每页显示数据条数 # # .用户输入页码(第一页.第二页...) # # .设定显示多少页号 # # .获取当前数据总条数 # # .根据设定显示多少页号和数据总条 ...

  6. Django分页(一)

    Django分页(一) 手动实现简单分页 HTML <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. django 分页出现 UnorderedObjectListWarning 错误

    django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unorde ...

  8. 2019.03.20 mvt,Django分页

    MVT模式   MVT各部分的功能:   M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理.       V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返 ...

  9. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  10. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

随机推荐

  1. python学习——字典和集合

    一.字典 1)字典介绍 字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字.字符串.元组,这种不可变的结构类型也称之为映射.字典类型是Python中唯一內建的映射类型. 1)字典操作 &qu ...

  2. PHP 与 MySQL 相关操作

    一.MySQL基操 •MySQL启动 注意:MySQL不能直接通过 mysql.exe 命令启动 MySQL客户端访问服务端需要寻找匹配:连接认证 连接:IP和端口确定,如果是本地都可以忽略 -h 主 ...

  3. ResourceManager基本职能和内部架构

    YARN也采用了Master/Slave结构,其中,Master实现为ResourceManager,负责整个集群资源的管理与调度:Slave实现为NodeManager,负责单个节点的资源管理与任务 ...

  4. python 用加法实现a,b两数相乘

    """思路:1.a * b = a + a + a + ... 2.a * b = n个a相加,只需求证b = n即可 3.用for 循环遍历即可,b就是range的最大 ...

  5. Mongodb操作1-linux安装数据库

    1.下载mongodb 百度云盘连接 :链接:https://pan.baidu.com/s/1b-hTS0XHQKpatecFoumLxw  提取码:z9ax 并送上可视化工具:链接:https:/ ...

  6. HDU2767Proving Equivalences tarjan缩点,如何求入度和出度最大值

    给定一个有向图,问最少增加多少条边后变成强连通图    tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0,  否则为缩点后点入度和出度的最大值,  证明:当入度或者出度不为0时 ...

  7. ACM-ICPC 2018 沈阳赛区(网络赛)

    D.Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with he ...

  8. codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)

    题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...

  9. Dokit支持iOS本地crash查看功能

    一.前言 在日常开发中或者测试过程中,我们的应用可能会出现Crash的问题.对于这类问题我们要抱着零容忍的态度,因为如果线上出现了这类问题,将会严重影响用户的体验. 如果Crash出现的时候恰好是在开 ...

  10. Java并发包下的几个API

    并发包 (计数器)CountDownLatch (屏障)CyclicBarrier (计数信号量)Semaphore 案例: 需求: 代码: 并发包 (计数器)CountDownLatch ​Coun ...