Python學習第163天(分頁初步實現)
阿新 • • 發佈:2020-10-12
先說一下自行實現分頁是如何進行的
USER_LIST=[]
# 1.類似於我們從資料庫中查收到的所有資料
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp)
def index(req):
per_page_count =10
# 2.設定每頁顯示的資訊的個數
current_page =req.GET.get('p')
# 3.通過前段獲取當前所在頁面的頁碼
current_page = int(current_page) # 此時獲得的頁碼資料型別為字串,需要進行格式轉換
# p = 1
start = (current_page-1)*per_page_count
end = current_page*per_page_count
# 4.通過當前頁資訊獲取本頁顯示的所有內容範圍
data = USER_LIST[start:end]
# 5.通過內容標籤的範圍來確定本頁顯示內容,並將此資料返回給前段
prev_count = current_page-1
next_count = current_page+1
# 6.上一頁和下一頁就是通過將p值減一或加一,然後重新整理頁面重新提交
return render(req,'index.html',{'user_list':data,'next_page':next_count,'prev_page':prev_count})
然後是關於Django自帶的分頁內容,這裡主要集中了兩個類,分別是Paginator、Page
Paginator可以通過內建的page方法生成Page物件,反之Page類也可以這樣操作
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.py
下面說一下Django存在的不足,我們常見的翻頁中都應該如下圖
變大的是當前頁面,左右各有幾個數字然後是上一頁,和下一頁
下面我們需要對Paginator進行一定的修改,所以我們可以重新寫一個類,繼承Paginator所有的方法,再增加新的方法用於實現顯示數字的功能
class CustomPaginator(Paginator): def __init__(self,current_page,per_page_num,*args,**kwargs): # 當年頁碼 self.current_page = int(current_page) # 最多顯示頁碼的個數 self.per_page_num = int(per_page_num) super(CustomPaginator,self).__init__(*args,**kwargs) def pager_num_range(self): # self.num_pages 表示總共有多少頁 # 情況1:當總頁數小於我們要顯示的頁碼個數 if self.num_pages<self.per_page_num: return range(1,self.num_pages+1) part = int(self.per_page_num/2) # 情況2:我們需要顯示10個頁碼,但是此時當前頁為第2頁,依舊顯示1-10 if self.current_page<=part: return range(1,self.per_page_num+1) # 情況3:我們需要顯示10個頁碼,共有20頁,但是此時當前頁為第18頁,依舊顯示11-20 if (self.current_page+part)>self.num_pages: return range(self.num_pages-self.per_page_num,self.num_pages+1) # 情況4:正常的中間情況 return range(self.current_page-part,self.current_page+part+1)
def index1(req):
#內建的很多資料
# per_page: 每頁顯示條目數量
# count: 資料總個數
# num_pages:總頁數
# page_range:總頁數的索引範圍,如: (1,10),(1,200)
# page: page物件(封裝是否有下一頁和上一頁,如果有,就會得到下一頁的頁碼
current_page = req.GET.get('p')
paginator = CustomPaginator(current_page,9,USER_LIST,10)
# Django自帶的分頁方法,傳遞USER_LIST即為所有的資料,
# 如果是使用資料庫操作就可以直接寫modles.Stundets.objuct.all()即可
try:
posts = paginator.page(current_page)
# posts 就是一個page物件
# has_next 是否有下一頁
# next_page_number 下一頁頁碼
# has_previous 是否有上一頁
# previous_page_number 上一頁頁碼
# object_list 分頁之後的資料列表,已經完成切片的資料
# number 當前頁
# paginator paginator物件(使之可以與Paginator物件可以進行相互轉換)
except PageNotAnInteger:# 所輸入的資料不是頁碼的情況
posts = paginator.page(1)
except EmptyPage: # 所輸入的頁碼超過頁碼範圍
posts = paginator.page(paginator.num_pages)
return render(req,'index1.html',{'posts':posts})
然後是對應的前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for row in posts.object_list %} <li>{{ row.name }}*{{ row.age }}</li> {% endfor %} </ul> {% include 'include/pager.html' %} {% if posts.has_previous %} <a href="/index1.html?p={{ posts.previous_page_number }}">上一頁</a> {# {% else %}#} {# <a href="#">上一頁</a>#} {% endif %} {% for i in posts.paginator.pager_num_range %} {% if i == posts.number %} <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1.html?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1.html?p={{ posts.next_page_number }}">下一頁</a> {% else %} <a href="">下一頁</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </html>
以上就是關於分頁的所有內容。