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> |