django高級應用(分頁功能)
1、原生分頁應用
前端html代碼

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <ul> 9 {% for item in posts.object_list %} 10 <li>{{ item.name }}- {{ item.age }}</li> 11 {% endfor %} 12 </ul> 13 {% include 'include/pages.html' %} 14 </body> 15 </html> 16 17 18 #include/pages.html 19 20 {% if posts.has_previous %} 21 <a href="/index1.html?p={{ posts.previous_page_number }}">上一頁</a> 22 {% else %} 23 <a href="#">上一頁</a> 24 {% endif %} 25 26 {% if posts.has_next %} 27 <a href="/index1.html?p={{ posts.next_page_number }}">下一頁</a> 28 {% endif %} 29 <span> 30 {{ posts.number }}/{{ posts.paginator.num_pages }} 31 </span>
django后台代碼

1 from django.shortcuts import render 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 4 USER_LIST = [] 5 for i in range(1, 999): 6 temp = {'name': 'root' + str(i), 'age': i} 7 USER_LIST.append(temp) 8 9 def index1(request): 10 # 全部數據:USER_LIST,=》得出共有多少條數據 11 # per_page: 每頁顯示條目數量 12 # count: 數據總個數 13 # num_pages:總頁數 14 # page_range:總頁數的索引范圍,如: (1,10),(1,200) 15 # page: page對象(是否具有下一頁;是否有上一頁;) 16 current_page = request.GET.get('p') 17 # Paginator對象 18 paginator = Paginator(USER_LIST, 10) 19 #paginator = CustemPaginator(current_page, 11, USER_LIST, 10) 20 try: 21 posts = paginator.page(current_page) 22 # has_next 是否有下一頁 23 # next_page_number 下一頁頁碼 24 # has_previous 是否有上一頁 25 # previous_page_number 上一頁頁碼 26 # object_list 分頁之后的數據列表,已經切片好的數據 27 # number 當前頁 28 # paginator paginator對象 29 except PageNotAnInteger: 30 posts = paginator.page(1) 31 except EmptyPage: 32 posts = paginator.page(paginator.num_pages) 33 return render(request, "index1.html", {"posts": posts}) 34 35 django后台代碼
缺點:功能少,例如顯示頁面范圍等。
2、自定制添加顯示頁面范圍的功能

1 {% if posts.has_previous %} 2 <a href="/index1.html?p={{ posts.previous_page_number }}">上一頁</a> 3 {% else %} 4 <a href="#">上一頁</a> 5 {% endif %} 6 7 {% for i in posts.paginator.page_num_range %} 8 {% if i == posts.number %} 9 <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a> 10 {% else %} 11 <a href="/index1.html?p={{ i }}">{{ i }}</a> 12 {% endif %} 13 {% endfor %} 14 15 {% if posts.has_next %} 16 <a href="/index1.html?p={{ posts.next_page_number }}">下一頁</a> 17 {% endif %} 18 <span> 19 {{ posts.number }}/{{ posts.paginator.num_pages }} 20 </span>
django后台代碼

1 from django.shortcuts import render 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 4 USER_LIST = [] 5 for i in range(1, 999): 6 temp = {'name': 'root' + str(i), 'age': i} 7 USER_LIST.append(temp) 8 9 class CustemPaginator(Paginator): 10 """ 11 是自定制django分頁類的方法 12 :page_num_range 顯示返回頁數范圍 13 :current_page 當前頁數 14 :max_page_num 最大顯示的頁碼數 15 """ 16 def __init__(self, current_page, max_pager_num, *args, **kwargs): 17 # 當前頁 18 self.current_page = int(current_page) 19 # 最多顯示的頁碼數量 20 self.max_pager_num = int(max_pager_num) 21 super(CustemPaginator,self).__init__(*args, **kwargs) 22 23 def page_num_range(self): 24 # 當前頁 25 # self.current_page 26 # 最多顯示的頁碼數量 11 27 # self.per_pager_num 28 # 總頁數 29 # self.num_pages 30 31 # 判斷如果頁面總數量小於顯示頁面的總數量,那么返回最大的頁面總數量。 32 if self.num_pages < self.max_pager_num: 33 return range(1, self.num_pages + 1) 34 part = int(self.max_pager_num / 2) 35 36 # 判斷當前頁小於等於最大顯示頁的一半,那么返回1到最大顯示頁數量。 37 if self.current_page <= part: 38 return range(1, self.max_pager_num + 1) 39 40 # 當選擇頁數加上顯示頁數的一半的時候,說明越界了,例如最大也數是15,顯示頁數是10,我選擇11頁,那么11+5等於16,大於15,那么就顯示總頁數15-11+1,15+1 41 if (self.current_page + part) > self.num_pages: 42 # 那么返回總頁數前去當前顯示頁數個數+1的值,和總頁數+1的值。 43 return range(self.num_pages - self.max_pager_num + 1, self.num_pages + 1) 44 45 # 當選擇頁大於當前總頁數的一半的時候,返回當前選擇頁的前五個和后五個頁數。 46 return range(self.current_page - part, self.current_page + part + 1) 47 48 49 def index1(request): 50 # 全部數據:USER_LIST,=》得出共有多少條數據 51 # per_page: 每頁顯示條目數量 52 # count: 數據總個數 53 # num_pages:總頁數 54 # page_range:總頁數的索引范圍,如: (1,10),(1,200) 55 # page: page對象(是否具有下一頁;是否有上一頁;) 56 current_page = request.GET.get('p') 57 # Paginator對象 58 # paginator = Paginator(USER_LIST, 10) 59 paginator = CustemPaginator(current_page, 11, USER_LIST, 10) 60 try: 61 posts = paginator.page(current_page) 62 # has_next 是否有下一頁 63 # next_page_number 下一頁頁碼 64 # has_previous 是否有上一頁 65 # previous_page_number 上一頁頁碼 66 # object_list 分頁之后的數據列表,已經切片好的數據 67 # number 當前頁 68 # paginator paginator對象 69 except PageNotAnInteger: 70 posts = paginator.page(1) 71 except EmptyPage: 72 posts = paginator.page(paginator.num_pages) 73 return render(request, "index1.html", {"posts": posts})
3、自定制分頁模塊

1 # -*- coding: utf-8 -*- 2 # @Time : 2017/7/4 3 # @Author : Ocean.Pan 4 5 class Pagination(object): 6 def __init__(self,current_page,total_page_count,per_page_item_num=10,max_page_num=7,page_url=None): 7 # 當前頁 8 self.current_page = current_page 9 try: 10 v = int(current_page) 11 if v <= 0: 12 v = 1 13 self.current_page = v 14 except Exception as e: 15 self.current_page = 1 16 # 數據總個數 17 self.total_page_count = total_page_count 18 # 每一頁顯示的頁面元素個數 19 self.per_page_item_num = per_page_item_num 20 # 最大顯示頁碼 21 self.max_page_num = max_page_num 22 self.page_url = page_url 23 24 def start_page_item(self): 25 ''' 26 開始顯示的頁面元素,即從第幾個頁面鏈接開始顯示 27 :return: 當前頁減一乘以每個頁面最多顯示元素個數 28 ''' 29 return (self.current_page-1) * self.per_page_item_num 30 31 def end_page_item(self): 32 ''' 33 結束顯示的頁面元素,即最后一個頁面元素的顯示 34 :return: 當前頁乘以每個頁面顯示的最大元素個數 35 ''' 36 return self.current_page * self.per_page_item_num 37 38 # @property 是讓num_pages變成以靜態屬性方式訪問。 39 @property 40 def num_pages(self): 41 ''' 42 總頁碼數量 43 :return: 當b為零的時候代表是可整除的,a就是返回值,當不能整除時a+1返回。 44 ''' 45 a,b = divmod(self.total_page_count,self.per_page_item_num) 46 if b == 0: 47 return a 48 return a+1 49 50 def page_num_range(self): 51 ''' 52 頁碼的顯示范圍 53 :return: 54 ''' 55 56 # 判斷如果頁面總數量小於顯示頁面的總數量,那么返回最大的頁面總數量。 57 if self.num_pages < self.max_page_num: 58 return range(1, self.max_page_num + 1) 59 part = int(self.max_page_num / 2) 60 61 # 判斷當前頁小於等於最大顯示頁的一半,那么返回1到最大顯示頁數量。 62 if self.current_page <= part: 63 return range(1, self.max_page_num + 1) 64 65 # 當選擇頁數加上顯示頁數的一半的時候,說明越界了,例如最大也數是15,顯示頁數是10,我選擇11頁,那么11+5等於16,大於15,那么就顯示總頁數15-11+1,15+1 66 if (self.current_page + part) > self.num_pages: 67 # 那么返回總頁數前去當前顯示頁數個數+1的值,和總頁數+1的值。 68 return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1) 69 70 # 當選擇頁大於當前總頁數的一半的時候,返回當前選擇頁的前五個和后五個頁數。 71 return range(self.current_page - part, self.current_page + part + 1) 72 73 def page_str(self): 74 page_list=[] 75 first = "<li><a href='/%s?p=1'>首頁</a></li>" % (self.page_url,) 76 page_list.append(first) 77 78 if self.current_page == 1: 79 prev = "<li><a href='#'>上一頁</a></li>" 80 else: 81 prev = "<li><a href='/%s?p=%s'>上一頁</a></li>" % (self.page_url,self.current_page - 1) 82 page_list.append(prev) 83 84 for i in self.page_num_range(): 85 if i == self.current_page: 86 temp = "<li class='active'><a href='/%s?p=%s'>%s</a></li>" %(self.page_url,i,i) 87 else: 88 temp = "<li><a href='/%s?p=%s'>%s</a></li>" % (self.page_url,i, i) 89 page_list.append(temp) 90 91 if self.current_page == self.num_pages: 92 nex = "<li><a href='#'>下一頁</a></li>" 93 else: 94 nex = "<li><a href='/%s?p=%s'>下一頁</a></li>" % (self.page_url,self.current_page + 1) 95 page_list.append(nex) 96 97 last = "<li><a href='/%s?p=%s'>尾頁</a></li>" %(self.page_url,self.num_pages) 98 page_list.append(last) 99 100 return ''.join(page_list)

1 from app01.paging import Pagination 2 3 USER_LIST = [] 4 for i in range(1, 999): 5 temp = {'name': 'root' + str(i), 'age': i} 6 USER_LIST.append(temp) 7 8 def index2(request): 9 current_page = request.GET.get('p') 10 page_obj = Pagination(current_page,999,page_url="index2.html") 11 data_list = USER_LIST[page_obj.start_page_item():page_obj.end_page_item()] 12 return render(request,"index2.html",{"data":data_list,"page_obj":page_obj})

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"/> </head> <body> <ul> {% for item in data %} <li>{{ item.name }}- {{ item.age }}</li> {% endfor %} </ul> <ul class="pagination pagination-sm"> {{ page_obj.page_str|safe }} </ul> </body> </html>