django的内置分页
本节内容
自定义一个简单的内置分页
Django内置分页
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。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自己自定制一个简单的内置分页,大概掌握内置分页的底层原理之后,自己就可以扩展分页。
首先定义每页分页为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)

