自定义分页模板(银角大王版)
生活随笔
收集整理的這篇文章主要介紹了
自定义分页模板(银角大王版)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
閱讀目錄
當數(shù)據(jù)庫中數(shù)據(jù)有很多,我們通常會在前端頁面做分頁展示。
分頁的數(shù)據(jù)可以在前端頁面實現(xiàn),也可以在后端實現(xiàn)分頁。
后端實現(xiàn)分頁的原理就是每次只請求一頁數(shù)據(jù)。
準備工作
我們使用腳本批量創(chuàng)建一些測試數(shù)據(jù)(將下面的代碼保存到bulk_create.py文件中放到Django項目的根目錄,直接執(zhí)行即可。)
測試數(shù)據(jù)創(chuàng)建
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學(xué)習Python基地,里面有很多學(xué)習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------import osif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")import djangodjango.setup()from app01 import modelsbulk_obj = (models.Publisher(name='沙河第{}出版社'.format(i)) for i in range(300))models.Publisher.objects.bulk_create(bulk_obj)自定義分頁
手擼版(內(nèi)部實現(xiàn)原理)
def publisher_list(request):# 從URL中取當前訪問的頁碼數(shù)try:current_page = int(request.GET.get('page'))except Exception as e:# 取不到或者頁碼數(shù)不是數(shù)字都默認展示第1頁current_page = 1# 總數(shù)據(jù)量total_count = models.Publisher.objects.count()# 定義每頁顯示多少條數(shù)據(jù)per_page = 10# 計算出總頁碼數(shù)total_page, more = divmod(total_count, per_page)if more:total_page += 1# 定義頁面上最多顯示多少頁碼(為了左右對稱,一般設(shè)為奇數(shù))max_show = 11half_show = max_show // 2# 計算一下頁面顯示的頁碼范圍if total_page <= max_show: # 總頁碼數(shù)小于最大顯示頁碼數(shù)page_start = 1page_end = total_pageelif current_page + half_show >= total_page: # 右邊越界page_end = total_pagepage_start = total_page - max_showelif current_page - half_show <= 1: # 左邊越界page_start = 1page_end = max_showelse: # 正常頁碼區(qū)間page_start = current_page - half_showpage_end = current_page + half_show# 數(shù)據(jù)索引起始位置data_start = (current_page-1) * per_pagedata_end = current_page * per_pagepublisher_list = models.Publisher.objects.all()[data_start:data_end]# 生成頁面上顯示的頁碼page_html_list = []page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')# 加首頁first_li = '<li><a href="/publisher_list/?page=1">首頁</a></li>'page_html_list.append(first_li)# 加上一頁if current_page == 1:prev_li = '<li><a href="#"><span aria-hidden="true">«</span></a></li>'else:prev_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">«</span></a></li>'.format(current_page - 1)page_html_list.append(prev_li)for i in range(page_start, page_end + 1):if i == current_page:li_tag = '<li class="active"><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)else:li_tag = '<li><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)page_html_list.append(li_tag)# 加下一頁if current_page == total_page:next_li = '<li><a href="#"><span aria-hidden="true">»</span></a></li>'else:next_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">»</span></a></li>'.format(current_page + 1)page_html_list.append(next_li)# 加尾頁page_end_li = '<li><a href="/publisher_list/?page={}">尾頁</a></li>'.format(total_page)page_html_list.append(page_end_li)page_html_list.append('</ul></nav>')page_html = "".join(page_html_list)return render(request, "publisher_list.html", {"publisher_list": publisher_list, "page_html": page_html})模板封裝建議使用版
class Pagination(object):"""自定義分頁(Bootstrap版)"""def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):""":param current_page: 當前請求的頁碼:param total_count: 總數(shù)據(jù)量:param base_url: 請求的URL:param per_page: 每頁顯示的數(shù)據(jù)量,默認值為10:param max_show: 頁面上最多顯示多少個頁碼,默認值為11"""try:self.current_page = int(current_page)except Exception as e:# 取不到或者頁碼數(shù)不是數(shù)字都默認展示第1頁self.current_page = 1# 定義每頁顯示多少條數(shù)據(jù)self.per_page = per_page# 計算出總頁碼數(shù)total_page, more = divmod(total_count, per_page)if more:total_page += 1self.total_page = total_page# 定義頁面上最多顯示多少頁碼(為了左右對稱,一般設(shè)為奇數(shù))self.max_show = max_showself.half_show = max_show // 2self.base_url = base_url@propertydef start(self):return (self.current_page-1) * self.per_page@propertydef end(self):return self.current_page * self.per_pagedef page_html(self):# 計算一下頁面顯示的頁碼范圍if self.total_page <= self.max_show: # 總頁碼數(shù)小于最大顯示頁碼數(shù)page_start = 1page_end = self.total_pageelif self.current_page + self.half_show >= self.total_page: # 右邊越界page_end = self.total_pagepage_start = self.total_page - self.max_showelif self.current_page - self.half_show <= 1: # 左邊越界page_start = 1page_end = self.max_showelse: # 正常頁碼區(qū)間page_start = self.current_page - self.half_showpage_end = self.current_page + self.half_show# 生成頁面上顯示的頁碼page_html_list = []page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')# 加首頁first_li = '<li><a href="{}?page=1">首頁</a></li>'.format(self.base_url)page_html_list.append(first_li)# 加上一頁if self.current_page == 1:prev_li = '<li><a href="#"><span aria-hidden="true">«</span></a></li>'else:prev_li = '<li><a href="{}?page={}"><span aria-hidden="true">«</span></a></li>'.format(self.base_url, self.current_page - 1)page_html_list.append(prev_li)for i in range(page_start, page_end + 1):if i == self.current_page:li_tag = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)else:li_tag = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)page_html_list.append(li_tag)# 加下一頁if self.current_page == self.total_page:next_li = '<li><a href="#"><span aria-hidden="true">»</span></a></li>'else:next_li = '<li><a href="{}?page={}"><span aria-hidden="true">»</span></a></li>'.format(self.base_url, self.current_page + 1)page_html_list.append(next_li)# 加尾頁page_end_li = '<li><a href="{}?page={}">尾頁</a></li>'.format(self.base_url, self.total_page)page_html_list.append(page_end_li)page_html_list.append('</ul></nav>')return "".join(page_html_list)實例
后端def publisher_list(request):# 從URL中取當前訪問的頁碼數(shù)current_page = int(request.GET.get('page'))# 比len(models.Publisher.objects.all())更高效total_count = models.Publisher.objects.count()page_obj = Pagination(current_page, total_count, request.path_info)data = models.Publisher.objects.all()[page_obj.start:page_obj.end]page_html = page_obj.page_html()return render(request, "publisher_list.html", locals())前端循環(huán)顯示那: {% for i in publisher_list %} .... {% endfor %}{{ page_obj.page_html|safe }}Django內(nèi)置分頁
Django內(nèi)置分頁view版
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: 每頁顯示條目數(shù)量# count: 數(shù)據(jù)總個數(shù)# num_pages:總頁數(shù)# page_range:總頁數(shù)的索引范圍,如: (1,10),(1,200)# page: page對象try:posts = paginator.page(current_page)# has_next 是否有下一頁# next_page_number 下一頁頁碼# has_previous 是否有上一頁# previous_page_number 上一頁頁碼# object_list 分頁之后的數(shù)據(jù)列表# number 當前頁# paginator paginator對象except PageNotAnInteger:posts = paginator.page(1)except EmptyPage:posts = paginator.page(paginator.num_pages)return render(request, 'index.html', {'posts': posts})Django內(nèi)置分頁html版
<!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>總結(jié)
以上是生活随笔為你收集整理的自定义分页模板(银角大王版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进度条打印函数
- 下一篇: EAFP vs LBYL