0. 框架自带

Django自带的分页功能:

1
2
3
4
5
6
7
8
9
10
11
12
from django.core.paginator import Paginator, Page, PageNotAnInteger, EmptyPage

def index(request, a):
current_page = request.GET.get('page')
user_list = models.UserInfo.objects.all()
paginator = Paginator(user_list, 2) # 显示内容,单页最大内容条数
try:
posts = paginator.page(current_page)
except PageNotAnInteger or EmptyPage as e:
posts = paginator.page(1)

return render(request, 'index.html', {'posts':posts})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<h1> 用户列表  </h1>
<ul>
{% for row in posts.object_list %}
<li>
{{ row.username }}
</li>
{% endfor %}
</ul>
<div>
{% if posts.has_previous %}
<a href="/index/?page={{ posts.previous_page_number }}">上一页</a>
{% endif %}
{% if posts.has_next %}
<a href="/index/?page={{ posts.next_page_number }}">下一页</a>
{% endif %}
</div>

1. 自开发

但由于只有Django框架有分页函数,且其自身的函数不好用(比如不支持显示左右部分分页),基于普适性规则,我们自己开发了分页函数:

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
import math
class PageInfo():

def __init__(self, current_page, item_num, per_page, base_url, show_page=5):
try :
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.page_num = math.ceil(item_num/per_page)
self.per_page = per_page
self.base_url = base_url
self.show_page = show_page
print("pagenum:",self.page_num)

def begin_item(self):
return (self.current_page-1) * self.per_page

def end_item(self):
return self.current_page * self.per_page

def show(self):
page_list = []
half = int((self.show_page-1)/2)

if self.page_num < self.show_page:
begin_page = 1
end_page = self.page_num + 1
elif self.current_page <= half:
begin_page = 1
end_page = self.show_page + 1
elif self.current_page >= self.page_num - half:
begin_page = self.page_num - self.show_page + 1
end_page = self.page_num + 1
else:
begin_page = self.current_page - half
end_page = self.current_page + half + 1

if self.current_page <= 1:
prev_page = "<li><a href='#'>上一页</a></li>"
else:
prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page-1)
page_list.append(prev_page)

for page in range(begin_page, end_page):
if page == self.current_page:
tag = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url, page, page)
else:
tag = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, page, page)
page_list.append(tag)

if self.current_page >= self.page_num:
next_page = "<li><a href='#'>下一页</a></li>"
else:
next_page = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page+1)
page_list.append(next_page)

return page_list

​ 调用:

1
2
3
4
5
6
7
8
current_page = int(request.GET.get('page'))

item_num = models.UserInfo.objects.all().count()
pageinfo = PageInfo(current_page, item_num, per_page=10, '/manageapp1/custom.html/')
user_list = models.UserInfo.objects.all()[pageinfo.begin_item() : pageinfo.end_item()]
page_list = pageinfo.show()

return render(request, 'custom.html', {'user_list':user_list, 'page_list':page_list})

custom.html:(需要引入Bootstrap)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<head lang="en">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h1> 用户列表 </h1>
<ul>
{% for row in user_list %}
<li>
{{ row.username }}
</li>
{% endfor %}
</ul>
<nav aria-label="Page navigation">
<ul class="pagination">
{% for page in page_list %}
{{page|safe}}
{% endfor %}
</ul>
</nav>
</body>

效果:

屏幕截图 2021-01-28 141650.jpg

  • 上方的{{page|safe}}是因为Django自带防止xss攻击的功能,发来的符合html格式的字符串并不会被当做html代码使用,需要加safe才会使其变为代码进行渲染。

    或者可以在后台标记其为安全:

1
2
3
4
from django.utils.safestring import mark_safe

temp = "<a href='...'>...</a>"
temp = mark_safe(temp)
  • 要加safe,一定注意对特殊字符进行过滤