from django.conf import settings
from django.utils.safestring import mark_safe
class MyPage:
def __init__(self, obj, page, page_url, query_get):
"""
:param obj: 需要做分页的数据源
:param page: 分页页码
:param page_url: 地址 request.path,
:param page_url: 可修改的Queryset request.GET.copy() 获取地址上参数做查询后的分页使用
"""
self.obj = obj
self.page = page
self.page_url = page_url
self.query_get = query_get
page_num = settings.PAGE_NUM # 分页每页显示的数量
page_max_num = settings.PAGE_MAX_NUM # 每页最多显示多少分页
obj_count = self.obj.count() # 总数据量
a, b = divmod(obj_count, page_num)
self.obj_page_num = a + 1 if b else a # 数据最多能分多少页
half_page = page_max_num // 2 # 计算中间页码做移动使用
if self.page:
self.page = int(self.page)
else:
self.page = 1
if self.obj_page_num < 1:
self.obj_page_num = 1
left_page = 1
right_page = self.obj_page_num
if self.obj_page_num <= page_max_num: # 如果数据能分的页数没设定显示的页数相同或更小时
left_page = left_page
right_page = right_page
else:
if self.page == 1 or self.page < page_max_num:
left_page = 1
right_page = page_max_num
else:
left_page = self.page - half_page # 移动
right_page = self.page + half_page
if self.page > self.obj_page_num - page_max_num: # 判断最后几页固定页码
left_page = self.obj_page_num - page_max_num
right_page = self.obj_page_num
self.page_range = range(left_page, right_page + 1)
self.obj_page_list = self.obj[page_num * (self.page - 1): self.page * page_num]
@property
def obj_list(self):
"""
:return: 分好页后每页的数据
"""
return self.obj_page_list
def page_html(self):
"""
:return: 分页html代码块
"""
_page_html = ''
self.query_get['page'] = 1
page_head = '<nav aria-label="Page navigation"><ul class="pagination">' \
'<li><a href="{0}?{1}">首页</a></li>'.format(self.page_url, self.query_get.urlencode())
_page_html += page_head
if self.page == 1:
page_last = '<li class="disable"><a href="javascript:void(0)" name="page" aria-label="Previous">' \
'<span aria-hidden="true">«</span></a></li>'
else:
page_last = '<li class="disable"><a href="{0}?{1}" name="page" aria-label="Previous">' \
'<span aria-hidden="true">«</span></a></li>'.\
format(self.page_url, self.query_get.urlencode())
_page_html += page_last
for i in self.page_range:
self.query_get['page'] = i
if i == self.page:
page_content = '<li class="active"><a href="{0}?{1}" name="page">{2}</a></li>'.\
format(self.page_url, self.query_get.urlencode(), i)
_page_html += page_content
else:
page_content = '<li class=""><a href="{0}?{1}" name="page">{2}</a></li>'.\
format(self.page_url, self.query_get.urlencode(), i)
_page_html += page_content
if self.page >= self.obj_page_num:
page_next = '<li class="disable"><a href="javascript:void(0)" aria-label="Next"><span aria-hidden="true">' \
'»</span></a>'
else:
self.query_get['page'] = self.page + 1
page_next = '<li class="disable"><a href="{0}?{1}" aria-label="Next">' \
'<span aria-hidden="true">»</span></a>'.format(self.page_url, self.query_get.urlencode())
_page_html += page_next
self.query_get['page'] = self.obj_page_num
page_final = '<li><a href="{0}?{1}">尾页</a></li></li></ul></nav>'.format(self.page_url, self.query_get.urlencode())
_page_html += page_final
return mark_safe(_page_html)
def customer_show(request):
if request.method == 'GET':
customer_obj = models.Customer.objects.all().order_by('-id')
# 分页
page = request.GET.get('page') # 获取当前页
my_paging = MyPage(customer_obj, page, request.path)
customer_obj = my_paging.obj_list
html_page = my_paging.page_html()
return render(request, 'customer.html',
{'customers_obj': customer_obj, 'html_page': html_page})