from django.utils.safestring import mark_safe
from django.http import QueryDict
class Paginnation:
def __init__(self, request, total_data,quary_parameter=QueryDict(), show_max=11, each_num=10):
self.quary_parameter = quary_parameter
self.quary_parameter._mutable = True #设置成True
self.base_url = request.path_info
# 最多显示页数
self.show_max = show_max
show_half = show_max // 2
# 每页显示的数据条数
self.each_num = each_num
# 总数据
self.total_data = total_data
# 显示的页码数
self.total_num, more = divmod(total_data, each_num)
if more:
self.total_num += 1
try:
self.current_page = int(request.GET.get('page', 1))
if self.current_page <= 0:
self.current_page = 1
elif self.current_page > self.total_num + 1:
current_page = self.total_num
except Exception as e:
current_page = 1
# 开始页数和结束页数
if self.total_num < show_max: # 当数据较少时,页数不够展示的最大页数
self.start_page = 1
self.end_page = self.total_num
else:
if self.current_page <= show_half:
self.start_page = 1
self.end_page = self.start_page + show_max - 1
elif self.current_page > self.total_num - show_half:
self.start_page = self.total_num - show_max + 1
self.end_page = self.total_num
else:
self.start_page = self.current_page - show_half
self.end_page = self.current_page + show_half
# 页面数据的起始值和结束
@property
def start(self):
return (self.current_page - 1) * self.each_num
@property
def end(self):
return self.current_page * self.each_num
@property
def html_li(self):
# 后端代替前端
html_list = []
self.quary_parameter['page'] = 1
first_li = '<li><a href = "{}?{}">首页</a></li>'.format(self.base_url,self.quary_parameter.urlencode())
html_list.append(first_li)
if self.current_page == 1:
prev_li = '<li><a class="disabled"><<<</a></li>'.format(self.current_page - 1)
else:
self.quary_parameter['page'] = self.current_page - 1
prev_li = '<li><a href = "{1}?{0}"><<<</a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
html_list.append(prev_li)
for num in range(self.start_page, self.end_page + 1):
self.quary_parameter['page'] = num
if self.current_page == num:
html_li = '<li class="active"><a href = "{1}?{2}">{0}</a></li>'.format(num,self.base_url,self.quary_parameter.urlencode())
else:
html_li = '<li><a href = "{1}?{2}">{0}</a></li>'.format(num,self.base_url,self.quary_parameter.urlencode())
html_list.append(html_li)
if self.current_page == self.total_num:
next_li = '<li><a class="disabled">>>></a></li>'.format(self.current_page + 1)
else:
self.quary_parameter['page'] = self.current_page + 1
next_li = '<li><a href = "{1}?{0}">>>></a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
html_list.append(next_li)
self.quary_parameter['page'] = self.total_num
last_li = '<li><a href = "{1}?{0}">尾页</a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
html_list.append(last_li)
return mark_safe(''.join(html_list))