1. 程式人生 > >Django之自定義分頁

Django之自定義分頁

plugin style 定義 mage user_list .sh render 進行 blog

應用於各頁面中的分頁實現,實現的結果如下圖

技術分享

1.先自定義一個有關分頁的PageInfo類

 1 class PageInfo(object):
 2 
 3     def __init__(self,current_page,all_count,per_page,base_url,show_page):
 4         """
 5         :param current_page:當前頁碼
 6         :param all_count:數據庫總行數
 7         :param per_page:每頁顯示行數
 8         :param base_url:模板路徑
9 :param show_page:顯示的頁數 10 """ 11 #確保url中page不為數字也可以顯示 12 try: 13 self.current_page = int(current_page) 14 except Exception as e: 15 self.current_page = 1 16 self.per_page = per_page 17 #通過divmod函數獲取總頁碼數 18 a,b = divmod(all_count,per_page)
19 if b: 20 a = a +1 21 self.all_pager = a 22 self.show_page = show_page 23 self.base_url = base_url 24 25 #起始頁 26 def start(self): 27 return (self.current_page-1) * self.per_page 28 #尾頁 29 def end(self): 30 return self.current_page * self.per_page
31 32 33 def pager(self): 34 # v = "<a href=‘/custom.html?page=1‘>1</a><a href=‘/custom.html?page=2‘>2</a>" 35 # return v 36 page_list = [] 37 38 half = int((self.show_page-1)/2) 39 40 # 如果數據總頁數 < show_page 41 if self.all_pager < self.show_page: 42 begin = 1 43 stop = self.all_pager + 1 44 # 如果數據總頁數 > show_page 45 else: 46 # 如果當前頁 <=half,永遠顯示1,show_page 47 if self.current_page <= half: 48 begin = 1 49 stop = self.show_page + 1 50 else: 51 if self.current_page + half > self.all_pager: 52 begin = self.all_pager - self.show_page + 1 53 stop = self.all_pager + 1 54 else: 55 begin = self.current_page - half 56 stop = self.current_page + half + 1 57 #首頁 58 first_page= "<li><a href=‘%s?page=%s‘>首頁</a></li>" %(self.base_url,1,) 59 page_list.append(first_page) 60 #上一頁,如果為第一頁,點擊上一頁將不跳轉 61 if self.current_page <= 1: 62 prev = "<li><a href=‘#‘>上一頁</a></li>" 63 else: 64 prev = "<li><a href=‘%s?page=%s‘>上一頁</a></li>" %(self.base_url,self.current_page-1,) 65 page_list.append(prev) 66 #生成中間頁碼跳轉鏈接 67 for i in range(begin,stop): 68 if i == self.current_page: 69 temp = "<li class=‘active‘><a href=‘%s?page=%s‘>%s</a></li>" %(self.base_url,i,i,) 70 else: 71 temp = "<li><a href=‘%s?page=%s‘>%s</a></li>" %(self.base_url,i,i,) 72 page_list.append(temp) 73 #下一頁,如果為最後一頁,點擊將不跳轉 74 if self.current_page >= self.all_pager: 75 nex = "<li><a href=‘#‘>下一頁</a></li>" 76 else: 77 nex = "<li><a href=‘%s?page=%s‘>下一頁</a></li>" %(self.base_url,self.current_page+1,) 78 page_list.append(nex) 79 #尾頁 80 last_page = "<li><a href=‘%s?page=%s‘>首頁</a></li>" % (self.base_url, self.all_pager) 81 page_list.append(last_page) 82 83 return ‘‘.join(page_list)

2.在views中寫方法

1 from utils.pager import PageInfo#導入PageInfo類
2 
3 def custom(request):
4     all_count = models.UserInfo.objects.all().count()#查詢數據總行數
5     page_info = PageInfo(request.GET.get(page), all_count, 10, /app01/custom.html, 11)#實例化類
6     user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]#頁面內需要顯示的信息內容
7     return render(request, custom.html, {user_list: user_list, page_info: page_info})#傳入模板進行渲染

3.需要渲染的‘custom.html‘文件

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css" />
 7 </head>
 8 <body>
 9     <h1>用戶列表</h1>
10     <ul>
11         {% for row in user_list %}
12             <li>{{ row.name }}</li>
13         {% endfor %}
14     </ul>
15 
16     <nav aria-label="Page navigation">
17       <ul class="pagination">
18           {{ page_info.pager|safe }}
19       </ul>
20     </nav>
21 </body>
22 </html>

4.添加url關系

 1 project文件下:
2 from django.conf.urls import url,include 3 from django.contrib import admin 4 5 urlpatterns = [ 6 url(r^app01/, include(app01.urls)), 7 ] 8 9 app01文件下: 10 11 from django.conf.urls import url 12 from django.contrib import admin 13 from app01 import views 14 urlpatterns = [ 15 url(r^custom.html$, views.custom), 16 ]

Django之自定義分頁