django自带的分页功能有局限性,只能显示所有页码,不能显示当前页的前五和后五页的页码。所有需要自己写。
from django.shortcuts import render
from app01.models import User
class MyPaginator:
def __init__(self, cur_page, per_page, total, show_page=11):
try:
self.cur_page = cur_page
except Exception as e:
self.cur_page = 1
self.per_page = per_page
self.total = total
self.show_page = show_page
a, b = divmod(int(self.total), self.per_page)#取余
if b:#如果有余数
self.total_page = a + 1#在商的结果上加1
else:
self.total_page = a
def start(self):
return (self.cur_page - 1) * self.per_page#显示开始的页码
def end(self):
return self.cur_page * self.per_page#显示结束的页码
def pager(self):
half = int((self.show_page - 1)/2)#当前页前后显示的页码数
if self.total_page <= self.show_page:#如果总页数小于等于需要要显示的页码数
begin = 1#页码开头为1
end = self.total_page
else:
if self.cur_page <= half:#如果当前页小于等于当前页前后显示的页码数
begin = 1
end = self.cur_page + half
elif self.cur_page + half > self.total_page:
begin = self.cur_page - half
end = self.total_page
else:
begin = self.cur_page - half
end = self.cur_page + half
paginator = []
if self.cur_page == 1:#如果当前页为1
label = "<a href=?cur_page=%s#></a>" % (self.cur_page)#标签为原来标签不减一
else:
label = "<a href=?cur_page=%s>上一页</a>" % (self.cur_page - 1)#则有上一页的标签
paginator.append(label)
for i in range(begin,end+1):
label = "<a href=?cur_page=%s>%s</a>" % (i,i,)
paginator.append(label)
if self.cur_page >= self.total_page:
label = "<a href=?cur_page=%s#></a>" % (self.cur_page)
else:
label = "<a href=?cur_page=%s>下一页</a>" % (self.cur_page + 1)
paginator.append(label)
return "".join(paginator)
def users(req):
total = User.objects.all().filter(id__lt=30).count()
cur_page = int(req.GET.get("cur_page"))
paginator = MyPaginator(cur_page, 10, total)
res = User.objects.all().filter(id__lt=30)[paginator.start():paginator.end()]
return render(req,"login.html",{"res":res,"paginator":paginator})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>人员名单</h2>
<ul>
{% for item in res %}
<li>{{ item.username }}</li>
{% endfor %}
</ul>
{{ paginator.pager |safe}}
</body>
</html>