Django分页器
1、views.py
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
81
82
83
84
85
86
87
88
89
90
|
#views.py
from
django.shortcuts
import
render, HttpResponse
# Create your views here.
from
app01.models
import
*
from
django.core.paginator
import
Paginator, EmptyPage, PageNotAnInteger
def
index(request):
obj_list
=
Book.objects.
all
()
paginator
=
Paginator(obj_list,
9
)
# 每页显示行数
try
:
current_page
=
int
(request.GET.get(
"page"
))
# 防止非数字
except
:
current_page
=
1
#########################################################
show_page
=
11
#默认显示页数
half
=
int
((show_page
-
1
)
/
2
)
all_pager
=
paginator.num_pages
#总页数
# 若是数据总页数 < 11
if
all_pager < show_page:
begin
=
1
stop
=
all_pager
+
1
# 若是数据总页数 > 11
else
:
# 若是当前页 <=5,永远显示1,11
if
current_page <
=
half:
begin
=
1
stop
=
show_page
+
1
else
:
if
current_page
+
half > all_pager:
begin
=
all_pager
-
show_page
+
1
stop
=
all_pager
+
1
else
:
begin
=
current_page
-
half
stop
=
current_page
+
half
+
1
page_range
=
range
(begin,stop)
#########################################################
try
:
obj_list
=
paginator.page(current_page)
except
PageNotAnInteger:
obj_list
=
paginator.page(
1
)
except
EmptyPage:
obj_list
=
paginator.page(paginator.num_pages)
# return render(request,"index.html",locals())
return
render(request,
"index.html"
, {
"obj_list"
: obj_list,
"current_page"
: current_page,
"page_range"
: page_range})
'''
批量导入数据:
Booklist=[]
for i in range(100):
Booklist.append(Book(title="book"+str(i),price=30+i*i))
Book.objects.bulk_create(Booklist)
分页器的使用:
obj_list=Book.objects.all()
paginator = Paginator(obj_list, 10) #每页显示10条
print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表
page1=paginator.page(1) #第1页的page对象
#显示某一页具体数据的两种方式:
#方式1
for i in page1: #遍历第1页的全部数据对象
print(i)
#方式2
print(page1.object_list) #第1页的全部数据
page2=paginator.page(2)
print(page2.has_next()) #是否有下一页
print(page2.next_page_number()) #下一页的页码
print(page2.has_previous()) #是否有上一页
print(page2.previous_page_number()) #上一页的页码
#当前页
current_page=int(request.GET.get("page",1))
obj_list=paginator.page(current_page)
for i in obj_list: #遍历当前页的全部数据对象
print(i)
# 抛错
#page=paginator.page(12) # error:EmptyPage
#page=paginator.page("z") # error:PageNotAnInteger
'''
|
2、index.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<!
DOCTYPE
html>
<
html
lang="en">
<
head
>
<
meta
charset="UTF-8">
<
title
>Title</
title
>
<
link
rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</
head
>
<
body
>
<
div
class="container">
<
h4
>分页器</
h4
>
<
ul
>
{% for row in obj_list %}
<
li
>{{ row.title }} -----{{ row.price }}</
li
>
{% endfor %}
</
ul
>
<
nav
aria-label="Page navigation">
<
ul
class="pagination" id="pager">
{% if obj_list.has_previous %}
<
li
class="previous"><
a
href="?page={{ obj_list.previous_page_number }}">上一页</
a
></
li
>
{% else %}
<
li
class="previous disabled"><
a
href="">上一页</
a
></
li
>
{% endif %}
{% for num in page_range %}
{% if num == current_page %}
<
li
class="item active"><
a
href="?page={{ num }}">{{ num }}</
a
></
li
>
{% else %}
<
li
class="item"><
a
href="?page={{ num }}">{{ num }}</
a
></
li
>
{% endif %}
{% endfor %}
{% if obj_list.has_next %}
<
li
class="next"><
a
href="?page={{ obj_list.next_page_number }}">下一页</
a
></
li
>
{% else %}
<
li
class="next disabled"><
a
href="">下一页</
a
></
li
>
{% endif %}
</
ul
>
</
nav
>
</
div
>
</
body
>
</
html
>
|
自定义分页
1、utils.pager.py
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
81
82
83
84
85
86
87
|
class
PageInfo(
object
):
def
__init__(
self
,current_page,all_count,per_page,base_url
=
'',show_page
=
7
):
"""
:param current_page:
:param all_count: 数据库总行数
:param per_page: 每页显示行数
:return:
"""
self
.all_count
=
all_count
try
:
self
.current_page
=
int
(current_page)
except
Exception as e:
self
.current_page
=
1
self
.per_page
=
per_page
a,b
=
divmod
(
self
.all_count,per_page)
if
b:
a
=
a
+
1
self
.all_pager
=
a
self
.show_page
=
show_page
self
.base_url
=
base_url
def
start(
self
):
return
(
self
.current_page
-
1
)
*
self
.per_page
def
end(
self
):
return
self
.current_page
*
self
.per_page
def
pager(
self
):
# v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
# return v
page_list
=
[]
half
=
int
((
self
.show_page
-
1
)
/
2
)
# 若是数据总页数 < 11
if
self
.all_pager <
self
.show_page:
begin
=
1
stop
=
self
.all_pager
+
1
# 若是数据总页数 > 11
else
:
# 若是当前页 <=5,永远显示1,11
if
self
.current_page <
=
half:
begin
=
1
stop
=
self
.show_page
+
1
else
:
if
self
.current_page
+
half >
self
.all_pager:
begin
=
self
.all_pager
-
self
.show_page
+
1
stop
=
self
.all_pager
+
1
else
:
begin
=
self
.current_page
-
half
stop
=
self
.current_page
+
half
+
1
first
=
"<li><a href='%s?page=1'>首页</a></li>"
%
(
self
.base_url,)
page_list.append(first)
if
self
.current_page <
=
1
:
prev
=
"<li class='previous disabled'><a href=''>上一页</a></li>"
else
:
prev
=
"<li class='previous'><a href='%s?page=%s'>上一页</a></li>"
%
(
self
.base_url,
self
.current_page
-
1
,)
page_list.append(prev)
for
i
in
range
(begin,stop):
if
i
=
=
self
.current_page:
temp
=
"<li class='item active'><a href='%s?page=%s'>%s</a></li>"
%
(
self
.base_url,i,i,)
else
:
temp
=
"<li class='item'><a href='%s?page=%s'>%s</a></li>"
%
(
self
.base_url,i,i,)
page_list.append(temp)
if
self
.current_page >
=
self
.all_pager:
nex
=
"<li class='next disabled'><a href='#'>下一页</a></li>"
else
:
nex
=
"<li class='next'><a href='%s?page=%s'>下一页</a></li>"
%
(
self
.base_url,
self
.current_page
+
1
,)
page_list.append(nex)
if
self
.all_pager >
0
:
last
=
"<li><a href='%s?page=%s'>尾页</a></li>"
%
(
self
.base_url,
self
.all_pager)
else
:
last
=
"<li><a href='%s?page=%s'>尾页</a></li>"
%
(
self
.base_url,
1
)
page_list.append(last)
total
=
"<li><span>共<b>%s</b>页<b>%s</b>条数据</span></li>"
%
(
self
.all_pager,
self
.all_count)
page_list.append(total)
return
''.join(page_list)
|
2、views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#app01.views.py
from
django.shortcuts
import
render, HttpResponse
from
utils.pager
import
PageInfo
from
app01.models
import
*
def
index(request):
# ==========begin 页码
try
:
current_page
=
int
(request.GET.get(
"page"
))
# 防止非数字
except
:
current_page
=
1
# base_url=request.path_info
all_count
=
Book.objects.
all
().count()
page_info
=
PageInfo(current_page,all_count,
8
)
obj_list
=
Book.objects.
all
()[page_info.start():page_info.end()]
# =========end 页码
return
render(request,
'index.html'
,{
'obj_list'
:obj_list,
'page_info'
:page_info})
|
3、index.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
|
<!
DOCTYPE
html>
<
html
lang="en">
<
head
>
<
meta
charset="UTF-8">
<
title
>Title</
title
>
<
link
rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</
head
>
<
body
>
<
div
class="container">
<
h4
>自定义分页</
h4
>
<
ul
>
{% for book in obj_list %}
<
li
>{{ book.title }} -----{{ book.price }}</
li
>
{% endfor %}
</
ul
>
<
nav
aria-label="Page navigation">
<
ul
class="pagination">
{{ page_info.pager|safe }}
</
ul
>
</
nav
>
</
div
>
</
body
>
</
html
>
|