浏览目录

  • 自定义分页

  • 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  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  in  range (show_start, show_end + 1 ):
         if  = =  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  in  range (show_start, show_end  +  1 ):
             if  = =  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
 
=  []
for  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>