自定义分页模板(银角大王版)
生活随笔
收集整理的這篇文章主要介紹了
自定义分页模板(银角大王版)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
閱讀目錄
當(dāng)數(shù)據(jù)庫(kù)中數(shù)據(jù)有很多,我們通常會(huì)在前端頁(yè)面做分頁(yè)展示。
分頁(yè)的數(shù)據(jù)可以在前端頁(yè)面實(shí)現(xiàn),也可以在后端實(shí)現(xiàn)分頁(yè)。
后端實(shí)現(xiàn)分頁(yè)的原理就是每次只請(qǐng)求一頁(yè)數(shù)據(jù)。
準(zhǔn)備工作
我們使用腳本批量創(chuàng)建一些測(cè)試數(shù)據(jù)(將下面的代碼保存到bulk_create.py文件中放到Django項(xiàng)目的根目錄,直接執(zhí)行即可。)
測(cè)試數(shù)據(jù)創(chuàng)建
-------------------------------------------------------------------- 注:如果你對(duì)python感興趣,我這有個(gè)學(xué)習(xí)Python基地,里面有很多學(xué)習(xí)資料,感興趣的+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)自定義分頁(yè)
手?jǐn)]版(內(nèi)部實(shí)現(xiàn)原理)
def publisher_list(request):# 從URL中取當(dāng)前訪問(wèn)的頁(yè)碼數(shù)try:current_page = int(request.GET.get('page'))except Exception as e:# 取不到或者頁(yè)碼數(shù)不是數(shù)字都默認(rèn)展示第1頁(yè)current_page = 1# 總數(shù)據(jù)量total_count = models.Publisher.objects.count()# 定義每頁(yè)顯示多少條數(shù)據(jù)per_page = 10# 計(jì)算出總頁(yè)碼數(shù)total_page, more = divmod(total_count, per_page)if more:total_page += 1# 定義頁(yè)面上最多顯示多少頁(yè)碼(為了左右對(duì)稱(chēng),一般設(shè)為奇數(shù))max_show = 11half_show = max_show // 2# 計(jì)算一下頁(yè)面顯示的頁(yè)碼范圍if total_page <= max_show: # 總頁(yè)碼數(shù)小于最大顯示頁(yè)碼數(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: # 正常頁(yè)碼區(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]# 生成頁(yè)面上顯示的頁(yè)碼page_html_list = []page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')# 加首頁(yè)first_li = '<li><a href="/publisher_list/?page=1">首頁(yè)</a></li>'page_html_list.append(first_li)# 加上一頁(yè)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)# 加下一頁(yè)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)# 加尾頁(yè)page_end_li = '<li><a href="/publisher_list/?page={}">尾頁(yè)</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):"""自定義分頁(yè)(Bootstrap版)"""def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):""":param current_page: 當(dāng)前請(qǐng)求的頁(yè)碼:param total_count: 總數(shù)據(jù)量:param base_url: 請(qǐng)求的URL:param per_page: 每頁(yè)顯示的數(shù)據(jù)量,默認(rèn)值為10:param max_show: 頁(yè)面上最多顯示多少個(gè)頁(yè)碼,默認(rèn)值為11"""try:self.current_page = int(current_page)except Exception as e:# 取不到或者頁(yè)碼數(shù)不是數(shù)字都默認(rèn)展示第1頁(yè)self.current_page = 1# 定義每頁(yè)顯示多少條數(shù)據(jù)self.per_page = per_page# 計(jì)算出總頁(yè)碼數(shù)total_page, more = divmod(total_count, per_page)if more:total_page += 1self.total_page = total_page# 定義頁(yè)面上最多顯示多少頁(yè)碼(為了左右對(duì)稱(chēng),一般設(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):# 計(jì)算一下頁(yè)面顯示的頁(yè)碼范圍if self.total_page <= self.max_show: # 總頁(yè)碼數(shù)小于最大顯示頁(yè)碼數(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: # 正常頁(yè)碼區(qū)間page_start = self.current_page - self.half_showpage_end = self.current_page + self.half_show# 生成頁(yè)面上顯示的頁(yè)碼page_html_list = []page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')# 加首頁(yè)first_li = '<li><a href="{}?page=1">首頁(yè)</a></li>'.format(self.base_url)page_html_list.append(first_li)# 加上一頁(yè)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)# 加下一頁(yè)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)# 加尾頁(yè)page_end_li = '<li><a href="{}?page={}">尾頁(yè)</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)實(shí)例
后端def publisher_list(request):# 從URL中取當(dāng)前訪問(wèn)的頁(yè)碼數(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)置分頁(yè)
Django內(nèi)置分頁(yè)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: 每頁(yè)顯示條目數(shù)量# count: 數(shù)據(jù)總個(gè)數(shù)# num_pages:總頁(yè)數(shù)# page_range:總頁(yè)數(shù)的索引范圍,如: (1,10),(1,200)# page: page對(duì)象try:posts = paginator.page(current_page)# has_next 是否有下一頁(yè)# next_page_number 下一頁(yè)頁(yè)碼# has_previous 是否有上一頁(yè)# previous_page_number 上一頁(yè)頁(yè)碼# object_list 分頁(yè)之后的數(shù)據(jù)列表# number 當(dāng)前頁(yè)# paginator paginator對(duì)象except PageNotAnInteger:posts = paginator.page(1)except EmptyPage:posts = paginator.page(paginator.num_pages)return render(request, 'index.html', {'posts': posts})Django內(nèi)置分頁(yè)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é)
以上是生活随笔為你收集整理的自定义分页模板(银角大王版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进度条打印函数
- 下一篇: EAFP vs LBYL