Django-website 程序案例系列-9 分页
分页例子程序:
LIST = [] #全局列表
for i in range(103): #1:100的列表
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p', 1) # GET接收的都是字符串
current_page = int(current_page) #字符串转换成数字
per_page_count = 5 #每页显示多少条数据
start = (current_page - 1) * per_page_count #页数显示数据开始
end = current_page * per_page_count #页数显示数据接收
data = LIST[start:end] #生成显示列表的索引
all_count = len(LIST) #判断列表总长度
total_count, y = divmod(all_count, per_page_count ) #取模函数,取10的模,count为取模多少次,y是剩余多少
if y: #如果y不为0 说明还有剩余的数
total_count += 1
page_list = [] #建立一个空列表
pageer_num = 7 #显示页码数
start_index = current_page - 5 #开始显示的页码数
end_index = current_page + 5 + 1 #结束显示的页码数
if total_count < pageer_num: #
start_index = 1
end_index = total_count + 1
else:
if current_page <= (pageer_num + 1)/2:
start_index = 1
end_index = pageer_num + 1
else:
start_index = current_page - (pageer_num - 1)/2
end_index = current_page + (pageer_num + 1)/2
if (current_page + (pageer_num - 1)/2) > total_count:
end_index = total_count + 1
start_index = total_count - pageer_num + 1
if current_page == 1: #当页数为开始时
prev = '<a class="page" href="javascript:void(0);">上一页</a>' #添加上一页标签不做跳转
else:
prev = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (current_page - 1) #否则添加带跳转参数的标签
page_list.append(prev)
for i in range(int(start_index), int(end_index)): #显示的页数是取模的数
if i == current_page: #如果判断页数为当前显示的页数
temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i) #给列表中传这个字符串,class中加入active的css样式
else:
temp = '<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i) #不是当前显示就传这个字符串
page_list.append(temp) #将字符串压入列表
if current_page == total_count: #当页数显示到尽头时
nex = '<a class="page" href="javascript:void(0);">下一页</a>' #添加下一页标签不做跳转
else:
nex = '<a class="page" href="/user_list/?p=%s">下一页</a>' % (current_page + 1) #否则添加带跳转参数的标签
page_list.append(nex)
#以下为添加跳转框的js代码
jump = """
<input type='text' /><a onclick='jumpTo(this, "/user_list/?p=")'>Go</a>
<script>
function jumpTo(th, base){
var val = th.previousSibling.value;
location.href = base + val;
}
</script>
"""
page_list.append(jump)
page_str = mark_safe("".join(page_list)) #转换成字符串,并打上安全标记传都前端
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pagination .page{
display: inline-block;
padding: 5px;
background-color: cornflowerblue;
margin: 10px;
}
.pagination .page.active{
background-color: #00aa00;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
<div class="pagination">
{{ page_str }}
</div>
</body>
</html>
封装成分页类:
class Page:
def __init__(self, current_page, data_count, per_page_num=10, pager_num=7):
self.current_page = current_page
self.data_count = data_count
self.per_page_num = per_page_num
self.pager_num = pager_num
@property #调用该方法时不用加括号 如:x.start() 直接使用 x.start 就可以调用
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
@property
def total_count(self):
v, y = divmod(self.data_count, self.per_page_num)
if y:
v += 1
return v
def page_str(self, base_url):
page_list = []
if self.total_count < self.pager_num:
start_index = 1
end_index = self.total_count + 1
else:
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1
end_index = self.pager_num + 1
else:
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
end_index = self.total_count + 1
start_index = self.total_count - self.pager_num + 1
if self.current_page == 1:
prev = '<a class="page" href="javascript:void(0);">上一页</a>'
else:
prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url, self.current_page - 1)
page_list.append(prev)
for i in range(int(start_index), int(end_index)):
if i == self.current_page:
temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
else:
temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
page_list.append(temp)
if self.current_page == self.total_count:
nex = '<a class="page" href="javascript:void(0);">下一页</a>'
else:
nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url, self.current_page + 1)
page_list.append(nex)
jump = """
<input type='text' /><a onclick='jumpTo(this, "%s?p=")'>Go</a>
<script>
function jumpTo(th, base){
var val = th.previousSibling.value;
location.href = base + val;
}
</script>
""" % (base_url)
page_list.append(jump)
page_str = mark_safe("".join(page_list))
return page_str
调用分页类:
LIST = [] #全局列表
for i in range(103): #1:100的列表
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p', 1)
current_page = int(current_page)
page_obj = Page(current_page, len(LIST))
data = LIST[page_obj.start: page_obj.end]
page_str = page_obj.page_str("/user_list/")
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
可以直接放到一个文件夹中,作为工具来调用:

调用方法为:
from utils import pagination
obj = pagination.Page(xx,yy) #创建分页类

浙公网安备 33010602011771号