【Python全棧-後端開發】Django進階-1
阿新 • • 發佈:2019-03-15
gen close sts tps set 是否 技術分享 http 開始
Django【進階篇-1 】
分頁
一、Django內置分頁
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger objects = [‘john‘,‘paul‘,‘george‘,‘ringo‘,‘lucy‘,‘meiry‘,‘checy‘,‘wind‘,‘flow‘,‘rain‘]
p = Paginator(objects,3) # 3條數據為一頁,實例化分頁對象 print(p.count) # 10 對象總共10個元素 print(p.num_pages) # 4 對象可分4頁 print(p.page_range) # range(1, 5) 對象頁的可叠代範圍,即頁碼為 1、2、3、4 page1 = p.page(1) # 取對象的第一分頁對象 print(page1.object_list) # 第一分頁對象的元素列表[‘john‘, ‘paul‘, ‘george‘] print(page1.number) # 第一分頁對象的當前頁值 1 # page2 = p.page(2) # 取對象的第二分頁對象 print(page2.object_list) # 第二分頁對象的元素列表 [‘ringo‘, ‘lucy‘, ‘meiry‘] print(page2.number) # 第二分頁對象的當前頁碼值 2 print(‘當前第一頁是否有上一頁‘,page1.has_previous()) # # 第一分頁對象是否有前一頁 False print(‘當前第一頁是否有其他頁‘,page1.has_other_pages()) # # 第一分頁對象是否有其它頁 Trueprint(page2.has_previous()) # # 第二分頁對象是否有前一頁 Trueprint(page2.has_next()) # # 第二分頁對象是否有下一頁 True print(page2.next_page_number()) # # 第二分頁對象下一頁碼的值 3 print(page2.previous_page_number()) # # 第二分頁對象的上一頁碼值 1 print(page2.start_index()) # # 第二分頁對象的元素開始索引 4(索引從1開始) print(page2.end_index()) # # 第2分頁對象的元素結束索引 6
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}) views.pyViews.py
<!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>HTML
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger class CustomPaginator(Paginator): def __init__(self, current_page, max_pager_num, *args, **kwargs): """ :param current_page: 當前頁 :param max_pager_num:最多顯示的頁碼個數 :param args: :param kwargs: :return: """ self.current_page = int(current_page) self.max_pager_num = max_pager_num super(CustomPaginator, self).__init__(*args, **kwargs) def page_num_range(self): # 當前頁面 # self.current_page # 總頁數 # self.num_pages # 最多顯示的頁碼個數 # self.max_pager_num print(1) if self.num_pages < self.max_pager_num: return range(1, self.num_pages + 1) print(2) part = int(self.max_pager_num / 2) if self.current_page - part < 1: return range(1, self.max_pager_num + 1) print(3) if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1) print(4) return range(self.current_page - part, self.current_page + part + 1) L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get(‘p‘) paginator = CustomPaginator(current_page, 11, 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})擴展內置分頁:view.py
<!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 %} {% for i in posts.paginator.page_num_range %} <a href="?p={{ i }}">{{ i }}</a> {% endfor %} {% if posts.has_next %} <a href="?p={{ posts.next_page_number }}">Next</a> {% endif %} </span> <span class="current"> Page {{ posts.number }} of {{ posts.paginator.num_pages }}. </span> </div> </body> </html>擴展內置分頁:HTML
二、自定義分頁
分頁功能在每個網站都是必要的,對於分頁來說,其實就是根據用戶的輸入計算出應該在數據庫表中的起始位置。
1、設定每頁顯示數據條數
2、用戶輸入頁碼(第一頁、第二頁...)
3、根據設定的每頁顯示條數和當前頁碼,計算出需要取數據表的起始位置
4、在數據表中根據起始位置取值,頁面上輸出數據
需求又來了,需要在頁面上顯示分頁的頁面。如:[上一頁][1][2][3][4][5][下一頁]
1、設定每頁顯示數據條數
2、用戶輸入頁碼(第一頁、第二頁...)
3、設定顯示多少頁號
4、獲取當前數據總條數
5、根據設定顯示多少頁號和數據總條數計算出,總頁數
6、根據設定的每頁顯示條數和當前頁碼,計算出需要取數據表的起始位置
7、在數據表中根據起始位置取值,頁面上輸出數據
8、輸出分頁html,如:[上一頁][1][2][3][4][5][下一頁]
總結,分頁時需要做三件事:
- 創建處理分頁數據的類
- 根據分頁數據獲取數據
- 輸出分頁HTML,即:[上一頁][1][2][3][4][5][下一頁]
【Python全棧-後端開發】Django進階-1