Django框架 之 Pagination分页实现
浏览目录
-
自定义分页
-
Django内置分页
一、自定义分页
1、基础版自定义分页
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
74
75
76
77
78
79
80
|
data
=
[]
for
i
in
range
(
1
,
302
):
tmp
=
{
"id"
: i,
"name"
:
"alex-{}"
.
format
(i)}
data.append(tmp)
print
(data)
def
user_list(request):
# user_list = data[0:10]
# user_list = data[10:20]
try
:
current_page
=
int
(request.GET.get(
"page"
))
except
Exception as e:
current_page
=
1
per_page
=
10
# 数据总条数
total_count
=
len
(data)
# 总页码
total_page, more
=
divmod
(total_count, per_page)
if
more:
total_page
+
=
1
# 页面最多显示多少个页码
max_show
=
11
half_show
=
int
((max_show
-
1
)
/
2
)
if
current_page <
=
half_show:
show_start
=
1
show_end
=
max_show
else
:
if
current_page
+
half_show >
=
total_page:
show_start
=
total_page
-
max_show
show_end
=
total_page
else
:
show_start
=
current_page
-
half_show
show_end
=
current_page
+
half_show
# 数据库中获取数据
data_start
=
(current_page
-
1
)
*
per_page
data_end
=
current_page
*
per_page
user_list
=
data[data_start:data_end]
# 生成页面上显示的页码
page_html_list
=
[]
# 加首页
first_li
=
'<li><a href="/user_list/?page=1">首页</a></li>'
page_html_list.append(first_li)
# 加上一页
if
current_page
=
=
1
:
prev_li
=
'<li><a href="#">上一页</a></li>'
else
:
prev_li
=
'<li><a href="/user_list/?page={}">上一页</a></li>'
.
format
(current_page
-
1
)
page_html_list.append(prev_li)
for
i
in
range
(show_start, show_end
+
1
):
if
i
=
=
current_page:
li_tag
=
'<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'
.
format
(i)
else
:
li_tag
=
'<li><a href="/user_list/?page={0}">{0}</a></li>'
.
format
(i)
page_html_list.append(li_tag)
# 加下一页
if
current_page
=
=
total_page:
next_li
=
'<li><a href="#">下一页</a></li>'
else
:
next_li
=
'<li><a href="/user_list/?page={}">下一页</a></li>'
.
format
(current_page
+
1
)
page_html_list.append(next_li)
# 加尾页
page_end_li
=
'<li><a href="/user_list/?page={}">尾页</a></li>'
.
format
(total_page)
page_html_list.append(page_end_li)
page_html
=
"".join(page_html_list)
return
render(request,
"user_list.html"
, {
"user_list"
: user_list,
"page_html"
: page_html})
|
2、封装保存版
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
74
75
76
77
78
79
|
class
Pagination(
object
):
def
__init__(
self
, current_page, total_count, base_url, per_page
=
10
, max_show
=
11
):
"""
:param current_page: 当前页
:param total_count: 数据库中数据总数
:param per_page: 每页显示多少条数据
:param max_show: 最多显示多少页
"""
try
:
current_page
=
int
(current_page)
except
Exception as e:
current_page
=
1
self
.current_page
=
current_page
self
.total_count
=
total_count
self
.base_url
=
base_url
self
.per_page
=
per_page
self
.max_show
=
max_show
# 总页码
total_page, more
=
divmod
(total_count, per_page)
if
more:
total_page
+
=
1
half_show
=
int
((max_show
-
1
)
/
2
)
self
.half_show
=
half_show
self
.total_page
=
total_page
@property
def
start(
self
):
return
(
self
.current_page
-
1
)
*
self
.per_page
@property
def
end(
self
):
return
self
.current_page
*
self
.per_page
def
page_html(
self
):
if
self
.current_page <
=
self
.half_show:
show_start
=
1
show_end
=
self
.max_show
else
:
if
self
.current_page
+
self
.half_show >
=
self
.total_page:
show_start
=
self
.total_page
-
self
.max_show
show_end
=
self
.total_page
else
:
show_start
=
self
.current_page
-
self
.half_show
show_end
=
self
.current_page
+
self
.half_show
# 生成页面上显示的页码
page_html_list
=
[]
# 加首页
first_li
=
'<li><a href="{}?page=1">首页</a></li>'
.
format
(
self
.base_url)
page_html_list.append(first_li)
# 加上一页
if
self
.current_page
=
=
1
:
prev_li
=
'<li><a href="#">上一页</a></li>'
else
:
prev_li
=
'<li><a href="{0}?page={1}">上一页</a></li>'
.
format
(
self
.base_url,
self
.current_page
-
1
)
page_html_list.append(prev_li)
for
i
in
range
(show_start, show_end
+
1
):
if
i
=
=
self
.current_page:
li_tag
=
'<li class="active"><a href="{0}?page={1}">{1}</a></li>'
.
format
(
self
.base_url, i)
else
:
li_tag
=
'<li><a href="{0}?page={1}">{1}</a></li>'
.
format
(
self
.base_url, i)
page_html_list.append(li_tag)
# 加下一页
if
self
.current_page
=
=
self
.total_page:
next_li
=
'<li><a href="#">下一页</a></li>'
else
:
next_li
=
'<li><a href="{0}?page={1}">下一页</a></li>'
.
format
(
self
.base_url,
self
.current_page
+
1
)
page_html_list.append(next_li)
# 加尾页
page_end_li
=
'<li><a href="{0}?page={1}">尾页</a></li>'
.
format
(
self
.base_url,
self
.total_page)
page_html_list.append(page_end_li)
return
"".join(page_html_list)
|
3、封装保存版使用指南
1
2
3
4
5
|
def
user_list(request):
pager
=
Pagination(request.GET.get(
"page"
),
len
(data), request.path_info)
user_list
=
data[pager.start:pager.end]
page_html
=
pager.page_html()
return
render(request,
"user_list.html"
, {
"user_list"
: user_list,
"page_html"
: page_html})
|
二、Django内置分页
1、内置分页view部分
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
|
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(L,
10
)
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
try
:
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})
|
2、内置分页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
26
27
28
29
|
<!DOCTYPE html>
<html>
<head lang
=
"en"
>
<meta charset
=
"UTF-8"
>
<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 }}"
>Previous<
/
a>
{
%
endif
%
}
<span
class
=
"current"
>
Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
<
/
span>
{
%
if
posts.has_next
%
}
<a href
=
"?p={{ posts.next_page_number }}"
>
Next
<
/
a>
{
%
endif
%
}
<
/
span>
<
/
div>
<
/
body>
<
/
html>
|