#!/usr/bin/env python
# encoding: utf-8
'''
@author: anthony.wang
@license: (C) Copyright 2000-2089, Node Supply Chain Manager Corporation Limited.
@contact: ianthony7@163.com
@software: Pycharm
@file: pager.py
@time: 2020/10/22 14:25
@desc:
'''
""""
使用文档:
pager = Pagination(当前页码数,总数据量,生成的URL)
# 切片取数据
all_depart = models.Department.objects.all()[pager.start:pager.end]
# 生成li标签
pager.page_html
{{ page_html|safe }}
"""
class Pagination:
def __init__(self, page, total_num, url, per_num=10, max_show=11):
try:
page = int(page)
if page < 1:
page = 1
except Exception as e:
page = 1
self.url = url
self.page = page
self.total_num = total_num
self.per_num = per_num
# 总页码数
self.total_page_num, more = divmod(self.total_num, self.per_num)
if more:
self.total_page_num += 1
# 最多显示页码数
self.max_show = max_show
half_show = self.max_show // 2
self.page_start = self.page - half_show # 1
self.page_end = self.page + half_show # 11
# 数据量少,不够生成11个页面的时候
if self.total_page_num < self.max_show:
self.page_start = 1
self.page_end = self.total_page_num
else:
# 可以生成11个页码
# 1 2 3 4 5
if self.page <= half_show:
self.page_start = 1
self.page_end = self.max_show
elif self.page + half_show > self.total_page_num:
self.page_start = self.total_page_num - self.max_show + 1
self.page_end = self.total_page_num
else:
self.page_start = self.page - half_show
self.page_end = self.page + half_show
@property
def start(self):
return (self.page - 1) * 10
@property
def end(self):
return self.page * 10
@property
def page_html(self):
page_list = []
if self.page == 1:
page_list.append('<li class="disabled"> <span aria-hidden="true">«</span> </li>')
else:
page_list.append('<li><a href="{}?page={}">«</a></li>'.format(self.url, self.page - 1))
for i in range(self.page_start, self.page_end + 1):
if i == self.page:
page_list.append('<li class="active"><a href="{}?page={}">{}</a></li>'.format(self.url, i, i))
else:
page_list.append('<li><a href="{}?page={}">{}</a></li>'.format(self.url, i, i))
if self.page == self.total_page_num:
page_list.append('<li class="disabled"> <span aria-hidden="true">»</span> </li>')
else:
page_list.append('<li><a href="{}?page={}">»</a></li>'.format(self.url, self.page + 1))
return ''.join(page_list)
<nav aria-label="Page navigation">
<ul class="pagination">
<li><a href="/crm/depart/list/?page=1">«</a></li>
{{ page_html|safe }}
<li><a href="/crm/depart/list/?page={{ total_page_num }}">»</a></li>
</ul>
</nav>
#!/usr/bin/env python
# encoding: utf-8
'''
@author: anthony.wang
@license: (C) Copyright 2000-2089, Node Supply Chain Manager Corporation Limited.
@contact: ianthony7@163.com
@software: Pycharm
@file: depart.py
@time: 2020/10/20 19:26
@desc:
'''
from django.shortcuts import render, reverse, redirect, HttpResponse
from crm import models
from django import forms
from crm.utils.pager import Pagination
def depart_list(request):
page = request.GET.get('page')
count = models.Department.objects.all().count()
pager = Pagination(page,count,request.path_info)
all_depart = models.Department.objects.all()[pager.start:pager.end]
return render(request, 'depart_list.html',
{'all_depart': all_depart, 'page_html': pager.page_html})