django高級應用(分頁功能)


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>
前端html代碼

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后台代碼
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>
前端html代碼

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+115+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})
django后台代碼

 

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+115+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>
前端展示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM