views.pyhtml
def depart_list(request): depart_all = models.Depart.objects.all() # 分頁 每頁最多顯示10條記錄 obj_total = depart_all.count() try: # 若是獲取不到page參數,將page_id默認設置成1 page_id = int(request.GET.get('page', 1)) except Exception as e: page_id = 1 # 第1頁切片,[0:10],取id爲0-9的10條記錄 # 第2頁切片,[10:20],取id爲10-19的10條記錄 # 第n頁切片,[(n-1)*10:n*10] obj_start = (page_id - 1) * 10 obj_end = page_id * 10 # 總頁碼數爲page_num page_num, more = divmod(obj_total, 10) if more: # 若是有餘數,則頁碼數加1 page_num += 1 # 第1頁序號從1-10,第2頁序號從11-20,而前端forloop.counter是從0開始,因此每頁序號起始值要加上(n-1)*10 obj_id_start = (page_id - 1) * 10 # 每頁的頁碼範圍 page_start = (page_id - 1) // 10 * 10 + 1 page_end = page_start + 10 # 若是結束頁碼大於總頁碼,就以總頁碼數爲結尾 if page_end > page_num: page_end = page_num + 1 return render(request, 'depart/depart_list.html', {'depart_all': depart_all[obj_start:obj_end], # 'page_total': range(1, page_num + 1), # 顯示全部的分頁頁碼 'page_total': range(page_start, page_end), # 顯示頁碼範圍 'obj_id_start': obj_id_start, })
user_list.html前端
{#分頁#} <div> <nav aria-label="Page navigation"> <ul class="pagination"> {#向前翻頁連接#} {{ page_previous }} {% for num in page_total %} {#num等於當前頁碼時,顯示active#} <li {% if page_id == num %}class="active"{% endif %}><a href="?page={{ num }}">{{ num }}</a></li> {% endfor %} {#向後翻頁連接#} {{ page_next }} </ul> </nav> </div>
因爲在views.py中編寫了大量分頁的功能,與核心邏輯無關,因此最好能將分頁功能單獨封裝成類,再在views中調用python
新建utils目錄中的paginate.py用於封裝分頁類django
from django.utils.safestring import mark_safe class Paginate: def __init__(self, obj_all, page_id, obj_max=10, page_max=10): self.obj_total = obj_all.count() # 分頁 每頁顯示的條目數,默認最多顯示10條記錄 self.obj_max = obj_max # 每頁最多顯示的頁碼個數 self.page_max = page_max try: # 若是獲取不到page參數,將page_id默認設置成1 self.page_id = page_id except Exception as e: self.page_id = 1 # 總頁碼數爲page_num self.page_total, more = divmod(self.obj_total, obj_max) if more: # 若是有餘數,則頁碼數加1 self.page_total += 1 # 第1頁切片,[0:10],取id爲0-9的10條記錄 # 第2頁切片,[10:20],取id爲10-19的10條記錄 # 第n頁切片,[(n-1)*10:n*10] #經過@property將方法封裝成屬性,在調用實例化對象.方法時就不須要加括號執行 @property def obj_start(self): obj_start = (self.page_id - 1) * self.obj_max return obj_start @property def obj_end(self): obj_end = self.page_id * self.obj_max return obj_end @property def obj_id_start(self): # 第1頁序號從1-10,第2頁序號從11-20,而前端forloop.counter是從0開始,因此每頁序號起始值要加上(n-1)*10 obj_id_start = (self.page_id - 1) * self.page_max return obj_id_start @property def page_start(self): # 每頁的頁碼範圍 page_start = (self.page_id - 1) // self.obj_max * self.page_max + 1 return page_start @property def page_end(self): page_end = self.page_start + self.page_max # 若是結束頁碼大於總頁碼,就以總頁碼數爲結尾 if page_end > self.page_total: page_end = self.page_total + 1 return page_end @property def page_previous(self): # 向前翻頁,若是頁面起始值爲1,則向前翻頁連接禁用 if self.page_start == 1: page_previous = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">«</span></a></li>' else: page_previous = '<li><a href="?page=%s" aria-label="Previous"><span aria-hidden="true">«</span></a></li>' \ % (self.page_start - self.obj_max) return mark_safe(page_previous) @property def page_next(self): # 向後翻頁,最後一頁向後翻頁連接禁用 if self.page_end == self.page_total + 1: page_next = '<li class="disabled"><a aria-label="Next"><span aria-hidden="true">»</span></a></li>' else: page_next = '<li><a href="?page=%s" aria-label="Next"><span aria-hidden="true">»</span></a></li>' \ % (self.page_start + self.obj_max) return mark_safe(page_next)
views.py文件中只須要實例化分頁類並傳參便可oop
def user_list(request): user_all = models.User.objects.all() #獲取當前頁面Url中的?page=id值,默認爲1 page_id = int(request.GET.get('page', 1)) #實例化分頁類 paginate = Paginate(user_all, page_id) #返回參數,使用對象.參數的方法調用,因爲類中使用了@property裝飾器將方法封裝成屬性,因此不須要加括號便可執行 return render(request, 'user/user_list.html', {'user_all': user_all[paginate.obj_start:paginate.obj_end], 'page_total': range(paginate.page_start, paginate.page_end), # 顯示頁碼範圍 'obj_id_start': paginate.obj_id_start, 'page_id': paginate.page_id, 'page_previous': paginate.page_previous, 'page_next': paginate.page_next, })
user_list.html前端渲染spa
{#分頁#} <div> <nav aria-label="Page navigation"> <ul class="pagination"> {#向前翻頁連接#} {{ page_previous }} {% for num in page_total %} {#num等於當前頁碼時,顯示active#} <li {% if page_id == num %}class="active"{% endif %}><a href="?page={{ num }}">{{ num }}</a></li> {% endfor %} {#向後翻頁連接#} {{ page_next }} </ul> </nav> </div>