django分页
·
一. Django内置分页
1.django内置分页
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 = Paginator(L, 10)
#paginator对象所含方法
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
try:
#page对象
posts = paginator.page(current_page)
#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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in posts %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if posts.has_previous %}
<a href="?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="?p=1">上一页</a>
{% endif %}
{% if posts.has_next %}
<a href="?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="?P={{ posts.paginator.num_pages }}">下一页</a>
{% endif %}
<span class="current">
{{ posts.number }}/{{ posts.paginator.num_pages }}
</span>
</span>
</div>
</body>
HTML
2.扩展django内置分页
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
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)
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对象
paginator = CustomPaginator(current_page,7,L, 10)
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
try:
#page对象
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in posts %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if posts.has_previous %}
<a href="?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="?p=1">上一页</a>
{% endif %}
{% for i in posts.paginator.page_num_range %}
<a href="?p={{ i }}">{{ i }}</a>
{% endfor %}
{% if posts.has_next %}
<a href="?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="?P={{ posts.paginator.num_pages }}">下一页</a>
{% endif %}
<span class="current">
{{ posts.number }}/{{ posts.paginator.num_pages }}
</span>
</span>
</div>
</body>
HTML
二. 自定制分页
1.自定制分页设计步骤
<1>设定每页显示数据条数
<2>用户输入页码(第一页、第二页...)
<3>设定显示多少页号
<4>获取当前数据总条数
<5>根据设定显示多少页号和数据总条数计算出,总页数
<6>根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
<7>在数据表中根据起始位置取值,页面上输出数据
<8>输出分页html,如:[上一页][1][2][3][4][5][下一页]
2.自定制分页设计
自定制Pagination类
class Pagination(object):
def __init__(self,TotalItemCount,CurrentPage,PerPageItemNum=10,MaxPageNum=7):
"""
input parameter
TotalItemCount:数据总个数
current_page: 当前页
PerPageItemNum:每页显示数据个数
MaxPageNum:最多显示的页码个数
:return:
"""
self.total_item_count = TotalItemCount
try:
CurrentPage = int(CurrentPage)
if CurrentPage <= 0:
CurrentPage = 1
self.current_page = CurrentPage
except Exception as e:
self.current_page = 1
self.per_page_item_num = int(PerPageItemNum)
self.max_page_num =int(MaxPageNum)
@property
def start(self):
"""当前页开始数据索引"""
return (self.current_page-1) * self.per_page_item_num
@property
def end(self):
"""当前页结束数据索引"""
return self.current_page * self.per_page_item_num
@property
def num_pages(self):
"""计算总页数"""
a,b = divmod(self.total_item_count,self.per_page_item_num)
if b == 0:
return a
return a+1
def page_num_range(self):
"""计算每页显示的页码"""
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+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
def page_html(self):
"""输出分页html"""
page_list = []
home_page = "<li><a href='/index.html?p=1'>首页</a></li>"
page_list.append(home_page)
if self.current_page == 1:
previous_page = "<li><a href='#'>上一页</a></li>"
else:
previous_page = "<li><a href='/index.html?p=%s'>上一页</a></li>" %(self.current_page-1,)
page_list.append( previous_page)
for i in self.page_num_range():
if i == self.current_page:
temp = "<li class='active'><a href='/index.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:
next_page = "<li><a href='#'>下一页</a></li>"
else:
next_page = "<li><a href='/index.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
page_list.append(next_page)
last_page = "<li><a href='/index.html?p=%s'>尾页</a></li>" %(self.num_pages,)
page_list.append(last_page)
return ''.join(page_list)
自定制Pagination类
调用自定制类
from django.shortcuts import render
from student_manage.views.pagination import *
USER_LIST = []
for i in range(1,666):
temp = {'name':'root'+str(i), 'age':i}
USER_LIST.append(temp)
def index(request):
current_page = request.GET.get('p')
TotalItemCount=len(USER_LIST)
print(TotalItemCount)
paginator=Pagination(TotalItemCount,current_page,'10','11')
data_list=USER_LIST[paginator.start:paginator.end]
return render(request, 'index.html', {'data_list': data_list,'paginator':paginator})
调用自定制类
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/plugin/bootstrap/css/bootstrap.css" />
</head>
<body>
<ul>
{% for item in data_list %}
<li>{{item}}</li>
{% endfor %}
</ul>
<ul class="pagination pagination-sm">
{{ paginator.page_html|safe }}
</ul>
</body>
</html>
>>>>>>待续
更多推荐
所有评论(0)