生活随笔
收集整理的這篇文章主要介紹了
Django内置的分页模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自定義分頁
未封裝版:
data = []for i in range(1, 302):tmp = {"id": i, "name": "alex-{}".format(i)}data.append(tmp)print(data)def user_list(request):# user_list = data[0:10]# user_list = data[10:20]try:current_page = int(request.GET.get("page"))except Exception as e:current_page = 1per_page = 10# 數據總條數total_count = len(data)# 總頁碼total_page, more = divmod(total_count, per_page)if more:total_page += 1# 頁面最多顯示多少個頁碼max_show = 11half_show = int((max_show-1)/2)if current_page <= half_show:show_start = 1show_end = max_showelse:if current_page + half_show >= total_page:show_start = total_page - max_showshow_end = total_pageelse:show_start = current_page - half_showshow_end = current_page + half_show# 數據庫中獲取數據data_start = (current_page - 1) * per_pagedata_end = current_page * per_pageuser_list = data[data_start:data_end]# 生成頁面上顯示的頁碼page_html_list = []# 加首頁first_li = '<li><a href="/user_list/?page=1">首頁</a></li>'page_html_list.append(first_li)# 加上一頁if current_page == 1:prev_li = '<li><a href="#">上一頁</a></li>'else:prev_li = '<li><a href="/user_list/?page={}">上一頁</a></li>'.format(current_page - 1)page_html_list.append(prev_li)for i in range(show_start, show_end+1):if i == current_page:li_tag = '<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)else:li_tag = '<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)page_html_list.append(li_tag)# 加下一頁if current_page == total_page:next_li = '<li><a href="#">下一頁</a></li>'else:next_li = '<li><a href="/user_list/?page={}">下一頁</a></li>'.format(current_page+1)page_html_list.append(next_li)# 加尾頁page_end_li = '<li><a href="/user_list/?page={}">尾頁</a></li>'.format(total_page)page_html_list.append(page_end_li)page_html = "".join(page_html_list)return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})
封裝版:
"""
自定義分頁組件
"""
class Pagination(object):def __init__(self, data_num, current_page, url_prefix, per_page=10, max_show=11):"""進行初始化.:param data_num: 數據總數:param current_page: 當前頁:param url_prefix: 生成的頁碼的鏈接前綴:param per_page: 每頁顯示多少條數據:param max_show: 頁面最多顯示多少個頁碼"""self.data_num = data_numself.per_page = per_pageself.max_show = max_showself.url_prefix = url_prefix# 把頁碼數算出來self.page_num, more = divmod(data_num, per_page)if more:self.page_num += 1try:self.current_page = int(current_page)except Exception as e:self.current_page = 1# 如果URL傳過來的頁碼數是負數if self.current_page <= 0:self.current_page = 1# 如果URL傳過來的頁碼數超過了最大頁碼數elif self.current_page > self.page_num:self.current_page = self.page_num # 默認展示最后一頁# 頁碼數的一半 算出來self.half_show = max_show // 2# 頁碼最左邊顯示多少if self.current_page - self.half_show <= 1:self.page_start = 1self.page_end = self.max_showelif self.current_page + self.half_show >= self.page_num: # 如果右邊越界self.page_end = self.page_numself.page_start = self.page_num - self.max_showelse:self.page_start = self.current_page - self.half_show# 頁碼最右邊顯示self.page_end = self.current_page + self.half_showif self.page_num < self.page_end:self.page_end = self.page_num # 如果總頁面小于結束頁面,那么結束頁面即為總頁碼@propertydef start(self):# 數據從哪兒開始切return (self.current_page - 1) * self.per_page@propertydef end(self):# 數據切片切到哪兒return self.current_page * self.per_pagedef page_html(self):# 生成頁碼l = []# 加一個首頁l.append('<li><a href="{}?page=1">首頁</a></li>'.format(self.url_prefix))# 加一個上一頁if self.current_page == 1:l.append('<li class="disabled" ><a href="#">?</a></li>'.format(self.current_page))else:l.append('<li><a href="{}?page={}">?</a></li>'.format(self.url_prefix, self.current_page - 1))for i in range(self.page_start, self.page_end + 1):if i == self.current_page:tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)else:tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)l.append(tmp)# 加一個下一頁if self.current_page == self.page_num:l.append('<li class="disabled"><a href="#">?</a></li>'.format(self.current_page))else:l.append('<li><a href="{}?page={}">?</a></li>'.format(self.url_prefix, self.current_page + 1))# 加一個尾頁l.append('<li><a href="{}?page={}">尾頁</a></li>'.format(self.url_prefix, self.page_num))return "".join(l)
?封裝版使用步驟:
將上面的一段代碼復制到自定義的模塊(pt文件)中導入自定義模塊在views系統的函數里寫入以下代碼 def user_list(request):# 實例化一個分頁類的對象obj = Pagination(blogs.count(),page,'blogs.html')# 根據傳入的總博客數、頁碼獲取當頁需要展示的博客blog_list = blogs[obj.start:obj.end]# 根據傳入的博客數及頁碼獲取生成分頁的html格式的頁碼列表page_html = pager.page_html()#返回指定頁面return render(request, "blog_list.html", {"blog_list": blog_list, "page_html": page_html})
在需要生成頁面的html頁面寫入以下代碼 <div class="topicListFooter fenye"><ul class="pagination">{{ page_html|safe }}</ul></div>
注:示例中用的是bootstrap分頁樣式
Django中的內置分頁(不能展示頁碼列表)
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []
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})內置分頁view部分
<!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部分
轉載于:https://www.cnblogs.com/fu-yong/p/8729436.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的Django内置的分页模块的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。