功能:分页组件
使用:
【views.py】
第一步:
from xitong.uitls.Pagenation import Pagenation
第二步:
定义queryset,并且实例化列表类
base_url = request.get_full_path_info() # 获取当前url(可带参数)
queryset = Psons.objects.filter(name__contains=keyword)
fengye = Pagenation(request, queryset, base_url, data_size=2, page_size=5, page_can="page")
第三步:
content = {
“datas”:fengye.queryset, # 显示数据
“html”:fengye.html(), # 显示页码
}
return render(request,‘list.html’,content)
【模板:list.html】
{% for ps in datas %}
{{ ps.name }}
...
{% endfor %}
<nav aria-label="Page navigation">
<ul class="pagination">
{{ html }}
</ul>
</nav>
以下源代码:
from django.utils.safestring import mark_safe
import urllib.parse as urlparse
from urllib.parse import urlencode
class Pagenation(object):
# 参数:
# request # 引入请求对象
# queryset # 筛选获取数据
# base_url # 基础url(可以带参数的)
# data_size = 10 # 每一页显示数据条数,默认为10
# page_size = 5 # 页码增加前 / 后几页
# page_can = "page" #url传达参数名,默认为 ?page
def __init__(self,request,queryset,base_url, data_size = 10, page_size = 5, page_can = "page"):
self.base_url = base_url
parsed = urlparse.urlparse(self.base_url)
querys = urlparse.parse_qs(parsed.query)
querys = {k: v[0] for k, v in querys.items()}
if page_can in querys:
''' url中有page参数情况'''
page = int(querys[page_can][0])
querys.pop(page_can)
self.last_url = urlencode(querys)
else:
''' url中没有page参数 '''
self.last_url = ''
page = 1
self.page = page # url分页参数
self.data_size = data_size # 数据显示条数
self.start_data = (page - 1) * data_size
self.end_data = page * data_size
self.queryset = queryset[self.start_data:self.end_data]
self.page_size = page_size
self.data_conent = queryset.count() # 总数据条数
page_count, b = divmod(self.data_conent, self.data_size)
if b != 0:
page_count += 1
self.page_count = page_count # 总共多少页码
self.page_can = page_can
def html(self):
if self.data_conent:
# 显示页码
if self.page_count <= self.page_size * 2 + 1:
# 数据比较少,未达到11页
start_page = 1
end_page = self.page_count
else:
# 数据比较多,超过11页
if self.page <= self.page_size:
# 向前取极限,到 1
start_page = 1
end_page = self.page_size * 2 + 1
else:
if (self.page + self.page_size) > self.page_count:
# 向后取极限 ,到总页数
start_page = self.page_count - self.page_size * 2
end_page = self.page_count
else:
# 中间情况,当前页 +/- 5
start_page = self.page - self.page_size
end_page = self.page + self.page_size
fen_ye = []
fen_ye.append('<li class="active"><a href="?' + self.page_can + '={}&{}">首 页</a></li>'.format(1,self.last_url))
if self.page <= 1:
up_page = '<li><a href="?' + self.page_can + '={}&{}">上一页</a></li>'.format(1,self.last_url)
else:
up_page = '<li><a href="?' + self.page_can + '={}&{}">上一页</a></li>'.format(self.page - 1,self.last_url)
fen_ye.append(up_page)
for i in range(start_page, end_page + 1):
if i == self.page:
xml = '<li class="active"><a href="?' + self.page_can + '={}&{}">{}</a></li>'.format(i,self.last_url, i)
else:
xml = '<li><a href="?' + self.page_can + '={}&{}">{}</a></li>'.format(i,self.last_url, i)
fen_ye.append(xml)
if self.page >= self.page_count:
down_page = '<li><a href="?' + self.page_can + '={}&{}">下一页</a></li>'.format(self.page_count,self.last_url)
else:
down_page = '<li><a href="?' + self.page_can + '={}&{}">下一页</a></li>'.format(self.page + 1,self.last_url)
fen_ye.append(down_page)
fen_ye.append('<li class="active"><a href="?' + self.page_can + '={}&{}">尾 页</a></li>'.format(self.page_count,self.last_url))
else:
fen_ye = ['<h5 style="color: #337ab7; padding-left: 20px;">空空如也,没有内容哦!</h5>']
html = mark_safe(' '.join(fen_ye))
return html