准备工作

为测试分页使用的数据库准备好300条测试数据

1
2
3
for i in range(300):
name = "Venti%s" %i
models.UserInfo.objects.create(name=name)

cur_page 当前页面序号

内置分页

前端通过 https://localhost:8000/?cur_page=666 分割获取到cur_paged的数值

处理含有非法分页数字的请求

1
2
3
4
5
6
7
8
9
10
11
12
def index(request):
try:
# 此时获取到的cur_page值为字符串形式
cur_page = request.GET.get('cur_page')
# 将字符串形式的cur_page值转换成整形
cur_page = int(cur_page)
except Exception as e:
# 如果cur_page值在转换过程中发生了类型转换错误,说明原先的cur_page不合法,捕获异常,并设置默认值为1
cur_page = 1

# 取出所有用户信息,待会儿把他分页
user_list = models.UserInfo.objects.all()

生成一个分页器对象

1
2
# 分页器对象  分页器类   待分页数据  每页数据数
pagiantor = Paginator(user_list,10)

内置分页器的一些属性和参数

per_page 每页显示条目的数量
count 数据的总个数
num_pages 总页数
page_range 总页数的索引范围
page page对象

1
2
# 测试
print(paginator.per_page, paginator.count, paginator.num_pages)

分页后的页面对象

1
users = paginator.page(cur_page)

页面对象的一些属性或方法

has_next 是否有下一页

next_page_number 下一页页码

has_previous 是否有上一页

previous_page_number 上一页页码

object_list 分页之后的数据列表

number 当前页

paginator paginator对象

自定制分页类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class PageInfo():
def __init__(self,cur_page,total,per_page=10,show_page=11):
# 获取当前页
try:
self.cur_page = int(cur_page)
except Exception as e:
self.cur_page = 1

self.per_page = per_page
self.show_page = show_page

# 总页数 / 每页页数
# total / per_page = a ……b
a , b = divmod(total,per_page)
if b:
self.total_page = a + 1
else:
self.total_page = a

def get_start(self):
return (self.cur_page - 1) * self.per_page

def get_stop(self):
return self.cur_page * self.per_page

def page(self):
half = int((self.show_page ) / 2)
### 总页数 < show_page == 11
if self.total_page < self.show_page:
begin = 1
stop = self.total_page + 1
else:
### 总页数 > show_page == 11
if self.cur_page - 1 < half:
begin = 1
stop = self.show_page + 1
elif self.cur_page + half > self.total_page:
# begin = self.cur_page - half
begin = self.total_page - self.show_page + 1
stop = self.total_page + 1
else:
begin = self.cur_page - half
stop = self.cur_page + half + 1
sli = []
if self.cur_page == 1:
# s = "<a style='display: inline-block; padding: 5px; margin: 5px;' href='#'>上一页</a>"
s = "<li class='disabled'><a href='#'>上一页</a></li>"
else:
# s = "<li><a style='display: inline-block; padding: 5px; margin: 5px;' href='/custom/?cur_page=%s'>上一页</a>" %(self.cur_page - 1)
s = "<li><a href='/custom/?cur_page=%s'>上一页</a></li>" %(self.cur_page - 1)

sli.append(s)

for num in range(begin, stop):
if num == self.cur_page:
# s = "<a style='display: inline-block; padding: 5px; margin: 5px;background-color: red' href='/custom/?cur_page=%s'>%s</a>" %(num, num)
s = "<li class='active'><a href='/custom/?cur_page=%s'>%s</a></li>" %(num, num)
else:
# s = "<a style='display: inline-block; padding: 5px; margin: 5px;' href='/custom/?cur_page=%s'>%s</a>" %(num, num)
s = "<li><a href='/custom/?cur_page=%s'>%s</a></li>" %(num, num)
sli.append(s)

if self.cur_page == self.total_page:
# s = "<a style='display: inline-block; padding: 5px; margin: 5px;' href='#'>下一页</a>"
s = "<li class='disabled'><a href='#'>下一页</a></li>"
else:
# s = "<a style='display: inline-block; padding: 5px; margin: 5px;' href='/custom/?cur_page=%s'>下一页</a>" % (self.cur_page + 1)
s = "<li><a href='/custom/?cur_page=%s'>下一页</a></li>" % (self.cur_page + 1)
sli.append(s)

page_str = " ".join(sli)

return page_str

调用自定制分页类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 自定制分页
def custom(request):

cur_page = request.GET.get('cur_page') ## 字符串类型
total = models.UserInfo.objects.count() # 301
pageinfo = PageInfo(cur_page, total)
# cur_page start stop
# 1 0 10
# 2 10 20
# 3 20 30
# n (n-1)*per_page n * per_page
start = pageinfo.get_start()
stop = pageinfo.get_stop()
user_list = models.UserInfo.objects.all()[start:stop]

return render(request, "custom.html",{"user_list":user_list, "pageinfo":pageinfo})

前端代码 第一版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
</head>
<body>
<ul>
{% for user in user_list.object_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>

{% if user_list.has_previous %}
<a href="/index/?cur_page={{ user_list.previous_page_number }}">上一页</a>
{% endif %}

{% for num in user_list.paginator.page_range %}
{% if num == user_list.number %}
<a style="display: inline-block; padding: 5px; margin: 5px;background-color: red" href="/index/?cur_page={{ num }}">{{ num }}</a>
{% else %}
<a style="display: inline-block; padding: 5px; margin: 5px;" href="/index/?cur_page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}

{% if user_list.has_next %}
<a href="/index/?cur_page={{ user_list.next_page_number }}">下一页</a>
{% endif %}

</body>
</html>

前端代码 第二版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<ul>
{% for user in user_list %}

<li>{{ user.name }}</li>
{% endfor %}
</ul>



<nav aria-label="Page navigation">
<ul class="pagination">
{{ pageinfo.page | safe }}
</ul>
</nav>
</body>
</html>