Django筆記–python實作將分頁功能封裝成類
對于資料的表格形式呈現,龐大的資料量不可能全部放在一頁中(除非資料很少),所以基本上都需要用到分頁功能,因此有必要將分頁功能封裝成一個類,方便使用,
pagination.py(將分頁功能分裝到Pagination類中)
from django.utils.safestring import mark_safe
class Pagination:
def __init__(self,request,all_count,per_num=10,max_show=11): #接收一個request物件(request)與int型別的總資料量(all_count)
'''
base_url:路徑
all_count: 總資料量
per_num: 每頁的資料量(默認值為10)
max_show: 每頁顯示的頁碼數(默認值為11)
total_num:總頁碼數
current_page:當前頁碼
page_start:當前頁面的第一個頁碼數
page_end:當前頁面的最后一個頁碼數
'''
self.base_url = request.path_info #獲取路徑
self.max_show = max_show #獲取每頁顯示頁碼數
self.per_num = per_num #獲取每頁的資料量
self.all_count = all_count #獲取總資料量
half_show = max_show // 2
self.total_num, more = divmod(all_count, per_num) #通過總資料量除每頁資料量來獲取總頁碼數與剩余資料量
try: #例外處理,獲取當前頁碼
self.current_page = int(request.GET.get('page', 1))
if self.current_page <= 0:
self.current_page = 1
except Exception as e:
self.current_page = 1
if more: #如果剩余資料量不為0,則總頁碼數加1
self.total_num += 1
if self.total_num <= max_show: #總頁碼數小于最大顯示頁碼數
self.page_start = 1
self.page_end = self.total_num
else: #總頁碼數大于最大顯示數
if self.current_page <= half_show: #特殊情況(當前頁碼 - 每頁顯示頁碼數的一半 < 1)
self.page_start = 1
self.page_end = max_show
elif self.current_page >= self.total_num: #特殊情況(當前頁碼 + 每頁顯示頁碼數的一半 > 總頁碼數)
self.page_start = self.total_num - max_show + 1
self.page_end = self.total_num
else: #正常情況
self.page_start = self.current_page - half_show
self.page_end = self.current_page + half_show
def start(self):
#回傳當前頁碼的第一個資料的索引
return (self.current_page - 1) * self.per_num
def end(self):
#回傳當前頁碼的最后一個資料的索引
return self.current_page * self.per_num
def show_li(self):
#回傳關于html的字串(回傳<li><a>標簽)
'''
html_list:暫時存放html字串的串列
first_li:關于“首頁”的html字串(直接跳轉第一頁的功能)
prev_li:關于“<<”的html字串(上一頁的功能)
li_html:關于頁碼顯示的html字串(頁面跳轉)
next_li:關于“>>”的html字串(下一頁的功能)
last:關于“尾頁”的html字串(直接跳轉最后一頁的功能)
'''
html_list = []
#首頁
first_li = '<li><a href="{}?page=1">首頁</a></li>'.format(self.base_url)
html_list.append(first_li)
#<<上一頁
if self.current_page == 1:
prev_li = '<li class="disabled"><a><<</a></li>' #當上一頁超過第一頁,則設定不可點擊disabled
else:
prev_li = '<li><a href="{1}?page={0}"><<</a></li>'.format(self.current_page - 1,self.base_url)
html_list.append(prev_li)
#顯示的頁碼
for num in range(self.page_start, self.page_end + 1):
if self.current_page == num: #當頁碼為當前頁碼數,則設定選中狀態active
li_html = '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(num,self.base_url)
else:
li_html = '<li><a href="{1}?page={0}">{0}</a></li>'.format(num,self.base_url)
html_list.append(li_html)
#>>下一頁
if self.current_page == self.total_num:
next_li = '<li class="disabled"><a>>></a></li>' #當下一頁超過總頁碼數,則設定不可點擊disabled
else:
next_li = '<li><a href="{1}?page={0}">>></a></li>'.format(self.current_page + 1,self.base_url)
html_list.append(next_li)
#尾頁
last_li = '<li><a href="{1}?page={0}">尾頁</a></li>'.format(self.total_num,self.base_url)
html_list.append(last_li)
return mark_safe(''.join(html_list)) #將串列拼接,回傳字串
后面的視圖函式與html頁面就列出部分,舉個例子:
views.py(視圖函式)
from pagination import Pagination
def customer_list(request):
all_customer = models.Customer.objects.all() #從資料庫中獲取資料
page = Pagination(request, all_customer.count()) #實體化物件
return render(request, 'crm/uesr_list.html', {'all_customer':all_customer[page.start():page.end()],'pagination':page.show_li()}) #回傳HTML頁面
user_list.html(html頁面)
<table class="table table-bordered">
<thead>
<tr>
<th>序號</th>
<th>用戶名</th>
<th>學號</th>
</tr>
</thead>
<tbody>
{% for user in data %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user.name }}</td>
<td>{{ user.number }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div style="text-align: center">
<nav aria-label="Page navigation">
<ul class="pagination">
{{ html_str }}
</ul>
</nav>
</div>
效果圖:(簡單展示功能)



END!筆記就記錄到此,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251770.html
標籤:python
