一.Django内置分页 - Paginator、 Page (这两个django里的类,用来内置分页)
没啥好说的,直接看代码吧
不过首先得在views下
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
views里
USER_LIST = []
for i in range(1,666):
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)
start = (current_page-1) * per_page_count
end = current_page*per_page_count
data = USER_LIST[start:end]
if current_page<=1:
prev_pager = 1
prev_pager = current_page -1
next_pager = current_page +1
return render(request,'index.html',{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager})
html里
Title
{% for row in user_list %}
- {{ row.name }}-{{ row.age }}
{% endfor %}
上一页
下一页
不建议这么使用
二。 - 扩展Django的内置分页 - CustomPaginator(Paginator) - 页面:include
传入:
- 所有数据
- 当前页
- 每页显示n条
- 最多页面m个
首先先顶一个类CustomPaginator来继承Paginator 传入上面4个参数
class CustomPaginator(Paginator):
def __init__(self,current_page, per_pager_num,*args,**kwargs):
# 当前页
self.current_page = int(current_page)
# 最多显示的页码数量 11
self.per_pager_num = int(per_pager_num)
super(CustomPaginator,self).__init__(*args,**kwargs) #这样就不用再写self.*args,self.**kwargs
def pager_num_range(self):
# 当前页
#self.current_page
# 最多显示的页码数量 11
#self.per_pager_num
# 总页数
# self.num_pages
if self.num_pages < self.per_pager_num: #如果总页数小于最多显示的页码数
return range(1,self.num_pages+1) #就显示当前总页数+1
# 总页数特别多 5
part = int(self.per_pager_num/2) #显示中间页
if self.current_page <= part: #如果当前页部分小于中间页
return range(1,self.per_pager_num+1) #就显示从第一页到最多显示的页码数+1
if (self.current_page + part) > self.num_pages: #页面“溢出”,当前页+中间页的总量超出了总页数
return range(self.num_pages-self.per_pager_num+1,self.num_pages+1) #显示的是从总页数-总页数+1到总页数+1
return range(self.current_page-part,self.current_page+part+1) #以上两种情况都不是,显示从当前页-中间页到当前页+中间页+1
再在view下定义
def index1(request):
# 全部数据:USER_LIST,=》得出共有多少条数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象(是否具有下一页;是否有上一页;)
current_page = request.GET.get('p') #获取当前页
# Paginator对象
paginator = CustomPaginator(current_page,7,USER_LIST, 10)
try:
# Page对象
posts = paginator.page(current_page) #posts是一个对象
# 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})
注意这里的posts是page对象,里面有各种方法
Index1.html
Title
{% for row in posts.object_list %}
- {{ row.name }}-{{ row.age }}
{% endfor %}
{% include 'include/pager.html' %}
include下的pager.html
{% if posts.has_previous %}
{# 如果有上一页#}
上一页
{% else %}
上一页
{% endif %}
{% for i in posts.paginator.pager_num_range %}
{% if i == posts.number %}
{{ i }}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
{% if posts.has_next %}
{# 如果有下一页#}
下一页
{% endif %}
{{ posts.number }}/{{ posts.paginator.num_pages }}
结果
三.扩展Django的内置分页--自定义分页
传入:
- 所有数据的个数
- 当前页
- 每页显示n条
- 最多页面m个
先自定义一个类 传入以上四个参数 以后任何都可以使用这个类,因为在类里把页面都写好了
@property 当写入这个时,以后调用函数内的方法可以不必加()直接函数名即可,能实现同样的功能
index2
def index2(request):
from app01.pager import Pagination
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})
index2.html
Title
{% for row in data %}
- {{ row.name }}-{{ row.age }}
{% endfor %}
{% for i in page_obj.pager_num_range %}
{{ i }}
{% endfor %}
{{ page_obj.page_str|safe }}
自定义的类
class Pagination(object):
# 传递有四个参数 - 所有数据的个数
# - 当前页
# - 每页显示n条
# # - 最多页面n个
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):
"""
总页数
:return:
"""
# 666
# 10
a,b = divmod(self.total_count,self.per_page_item_num)
if b == 0:
return a
return a+1
def pager_num_range(self):
# self.num_pages()
# self.num_pages
# 当前页
#self.current_page
# 最多显示的页码数量 11
#self.per_pager_num
# 总页数
# self.num_pages
if self.num_pages < self.max_page_num:
return range(1,self.num_pages+1)
# 总页数特别多 5
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+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
def page_str(self):
page_list = []
first = "首页 "
page_list.append(first)
if self.current_page == 1:
prev = "上一页 "
else:
prev = "上一页 " %(self.current_page-1,)
page_list.append(prev)
for i in self.pager_num_range():
if i == self.current_page:
temp = "%s " %(i,i)
else:
temp = "%s " % (i, i)
page_list.append(temp)
if self.current_page == self.num_pages:
nex = "下一页 "
else:
nex = "下一页 " % (self.current_page + 1,)
page_list.append(nex)
last = "尾页 " %(self.num_pages)
page_list.append(last)
return ''.join(page_list)