django架構雖然帶有自己的分頁功能,但是樣式不好看,為了做更好看的分頁,需要自定義一個分頁工具,話不多說撸起袖子就開幹。
1.首先先建一個python檔案叫pager.py代碼如下:
class Pagination(object):
"""
page_url 翻頁url路由
object_list 資料源清單
current_page 目前頁
page_size 每頁顯示的資料條數
maxPageNum 分頁條顯示的分頁數
def __init__(self, page_url, object_list, current_page, page_size=10, maxPageNum=7):
# 翻頁的url
self.page_url = page_url
# 分資料源
self.object_list = object_list
# 資料總個數
self.total_count = object_list.count()
# 目前頁
try:
v =int(current_page)
if v <=0:
v =1
self.current_page = v
except Exception as e:
self.current_page =1
# 每頁顯示的行數
self.per_page_item_num = page_size
# 最多顯示頁面
self.max_page_num = maxPageNum
def start(self):
return (self.current_page -1) *self.per_page_item_num
def end(self):
return self.current_page *self.per_page_item_num
# 擷取分頁後的資料
def page_list(self):
return self.object_list[self.start():self.end()]
@property
def num_pages(self):
總頁數
:return:
a, b =divmod(self.total_count, self.per_page_item_num)
if b ==0:
return a
return a +1
def pager_num_range(self):
# self.num_pages()
# self.num_pages
# current_page
# 最多顯示的頁碼數量 11
# self.per_pager_num
# 總頁數
if self.num_pages
return range(1, self.num_pages +1)
# 總頁數特别多 5
part =int(self.max_page_num /2)
if self.current_page <= part:
return range(1, self.max_page_num +1)
if (self.current_page + part) >self.num_pages:
return range(self.num_pages -self.max_page_num +1, self.num_pages +1)
return range(self.current_page - part, self.current_page + part +1)
def page_str(self):
page_list = []
first ="<li><a href='%s?page=1'></li>" %self.page_url
page_list.append(first)
if self.current_page ==1:
prev ="<li class='previous disabled'><a href='#'>上一頁</a></li>"
else:
prev ="<li><a href='%s?page=%s'></a><li>" % (self.page_url, self.current_page -1,)
page_list.append(prev)
for iin self.pager_num_range():
if i ==self.current_page:
temp ="<li><a href='%s?page=%s'>%s</li>" % (self.page_url, i, i)
else:
temp ="<li><a href='%s?page=%s'>%s</a></li>" % (self.page_url, i, i)
page_list.append(temp)
if self.current_page ==self.num_pages:
nex ="<li class='previous disabled'><a href='#'>下一頁</a></li>"
nex ="<li><a href='%s?page=%s'>%s</a></li>" % (self.page_url, self.current_page +1,)
page_list.append(nex)
last ="<li><a href='%s?page=%s'>尾頁</a></li>" % (self.page_url, self.num_pages,)
page_list.append(last)
return ''.join(page_list)
2.那麼建好了這個自定義的分頁器後,就開始來測試看看效果怎麼樣了:
在templates裡建立page.html,views檔案裡加如一個新的函數比如叫page:(注意要記的在urls裡添加page的路由)
2.1 views裡的代碼:
# 使用自定義分頁
def page(request):
# 引入剛剛定義好的分頁工具
from example.pager import Pagination
# 擷取翻頁的頁碼
current_page = request.GET.get('page')
# 查詢資料
articles = Article.objects.all()
# 參數說明 第一個為分頁的url 第二個為分頁資料源,第三個為目前頁,第四個為每頁顯示的資料條數,第五個為分頁條分組預設為7個一組
pager = Pagination('/page/', articles, current_page, 5, 7)
return render(request, 'page.html', {"data": pager.page_list(), 'pager': pager})
2.2 page.html 代碼:
{%extends 'base.html' %}
{%block title %}自定義分頁{%endblock %}
{%block main %}
{%for item in data %}
{{item.title }}-{{item.content }}
{%endfor %}
{{pager.page_str|safe }}
{%endblock %}
2.3 base.html 其實就是引入bootstrap :
<html lang='en'>
<title>{%block title %}{%endblock %}</title>
<head>
<meta charset='utf-8'>
{%load static %}
<link rel="stylesheet" href="{%static 'css/bootstrap.min.css' %}">
<script src="{%static 'js/jquery-3.3.1.min.js' %}"></script>
<script src="{%static 'js/bootstrap.min.js' %}"></script>
{%block head %}{%endblock %}
</head>
<body>
{%block main %}{%endblock %}
</body>
</html>
3.運作效果:

4.總結:
好了,django自定義分頁就到這裡了,但是,這種分頁是有些問題存在的,從代碼裡可以到是通過先查全部資料出來然後對資料清單進行分頁處理,當資料量大的時候就不建議這樣做了,那麼如何做高效的分頁呢,下篇文章将會做個優化,喜歡記得關注我哦,當然,有問題也歡迎提出來!
部落格園:
猿哥愛碼