?Django內(nèi)置了分頁(yè)設(shè)置,但不夠靈活,需要我們自定義分頁(yè)。
下面代碼考慮了利用bootstrap分頁(yè)組件來(lái)實(shí)現(xiàn)頁(yè)面美化,如果不想使用,可以不調(diào)用url_format_by_bootstrap函數(shù),即可實(shí)現(xiàn)普通分頁(yè)。
具體的參數(shù)和代碼均有注釋
#! python3
# @Project: mysite2 - pager.py
# @Info : 自定義分頁(yè)操作
import re
class PageInfo:
"""
:param current_page 當(dāng)前頁(yè)碼
:param data 要分頁(yè)的數(shù)據(jù)
:param path 路由地址(用于生成動(dòng)態(tài)路徑)
:param per_page 每頁(yè)顯示條數(shù)
:param show_page 顯示頁(yè)碼跨度
"""
def __init__(self, current_page, data, path, per_page=10, show_page=10):
self.current_page = current_page
self.per_page = per_page
self.show_page = show_page
self.data = data
self.path = path
self.all_page = self.get_all_page()
def get_all_page(self):
"""計(jì)算總頁(yè)數(shù)"""
result, mod = divmod(len(self.data), self.per_page)
if mod:
return result + 1
else:
return result
def create_page(self):
"""創(chuàng)建頁(yè)碼列表"""
if not (isinstance(self.show_page, int) | self.show_page < 1):
self.show_page = 10
half = self.show_page // 2
start = self.current_page - half
end = self.current_page + half
# 避免出現(xiàn)負(fù)數(shù)頁(yè)
if self.current_page - half <= 0:
start = 1
if self.current_page + half > self.all_page:
end = self.all_page
# 若當(dāng)前頁(yè)靠近兩端,保持頁(yè)面達(dá)到show_page的數(shù)量
if self.current_page <= half:
end = self.show_page + 1
if self.current_page >= self.all_page - half:
start = self.all_page - self.show_page
# 上下頁(yè)
page_list = []
pre_page = self.current_page - 1 if self.current_page - 1 > 0 else 1
next_page = self.current_page + 1 if self.current_page + 1 < self.all_page else self.all_page
# 將生成的頁(yè)碼標(biāo)簽添加進(jìn)page_list
page_list.append(self.get_page_url(self.path, '上一頁(yè)', pre_page))
for i in range(start, end + 1):
url = self.get_page_url(self.path, i, i)
page_list.append(url)
page_list.append(self.get_page_url(self.path, '下一頁(yè)', next_page))
return self.url_format_by_bootstrap(page_list)
def per_page_content(self, data):
"""計(jì)算每頁(yè)內(nèi)容"""
start_index = (self.current_page - 1) * self.per_page
end_index = self.current_page * self.per_page
return data[start_index:end_index]
# 聲明為靜態(tài)方法,未使用類(lèi)中變量
@staticmethod
def get_page_url(path, text, num):
"""獲取動(dòng)態(tài)頁(yè)碼鏈接"""
url = '
{2}
'.format(path, num, text)
return url
def url_format_by_bootstrap(self, page_list):
"""將url轉(zhuǎn)化為bootstrap分頁(yè)需要的格式"""
pre_url = re.findall('href="(.*?)"', page_list[0])[0]
next_url = re.findall('href="(.*?)"', page_list[-1])[0]
page_list[0] = '''
'''.format(pre_url)
page_list[-1] = '''
'''.format(next_url)
for index, page in enumerate(page_list[1:-1]):
# 將當(dāng)前頁(yè)設(shè)置為選中狀態(tài)
page_num = int(re.search(r'page=(\d+)', page).group(1))
if self.current_page == page_num:
page_list[index + 1] = '
{0}
'.format(page)
continue
page_list[index + 1] = '
{0}
'.format(page)
return page_list
在view頁(yè)面只需要傳參數(shù)就可生成頁(yè)碼
import logging
from django.http import HttpResponse
from django.shortcuts import render
from . import models
from utils.pager import PageInfo
def index(request):
"""首頁(yè)"""
try:
current_page_num = int(request.GET['page'])
except Exception as e:
logging.log(logging.ERROR, e)
current_page_num = 1
data = models.UserInfo.objects.all()
page_info = PageInfo(current_page_num, data, '/index')
page_list = page_info.create_page()
user_list = page_info.per_page_content(data)
return render(request, 'index.html', {'user_list': user_list, 'page_list': page_list})
由于是后端動(dòng)態(tài)生成頁(yè)碼標(biāo)簽,前段直接遍歷即可。
這里應(yīng)用了bootstrap樣式。
Title
用戶(hù)列表
{% for row in user_list %}
-
{{ row.username }}
{% endfor %}
具體效果如下:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
