个人分页
class Pagination(object):
def __init__(self, request,current_page_num, all_count, per_page_num=10, pager_count=11):
"""
个人分页器 1.1版本 查询字符串获取page参数
:param request: 保存搜索条件
:param current_page_num: 当前页码数
:param all_count: 总个数
:param per_page_num: 每页显示个数
:param pager_count: 显示的总页码数
"""
try:
current_page_num = int(current_page_num)
except Exception as e:
current_page_num = 1
if current_page_num < 1:
current_page_num = 1
self.current_page_num = current_page_num
self.all_count = all_count
self.per_page_num = per_page_num
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager
self.pager_count = pager_count
self.pager_count_half = int((pager_count-1) / 2)
import copy
self.params = copy.deepcopy(request.GET)
@property
def start(self):
return (self.current_page_num - 1) * self.per_page_num
@property
def end(self):
return self.current_page_num * self.per_page_num
def counter(self):
return (self.current_page_num - 1) * self.per_page_num
def page_html(self):
if self.all_pager < self.pager_count:
pager_start = 1
pager_end = self.all_pager
else:
if self.current_page_num <= self.pager_count_half:
pager_start = 1
pager_end = self.pager_count
else:
if (self.current_page_num + self.pager_count_half) > self.all_pager:
pager_start = self.all_pager - self.pager_count + 1
pager_end = self.all_pager
else:
pager_start = self.current_page_num - self.pager_count_half
pager_end = self.current_page_num + self.pager_count_half
page_html_list = []
first_page = '<li><a href="?page={}">首页</a></li>'.format(1)
page_html_list.append(first_page)
if self.current_page_num <= 1:
prev_page = '<li class="disabled"><a herf="">上一页</a></li>'
else:
prev_page = '<li><a href="?page={}">上一页</a></li>'.format(self.current_page_num-1)
page_html_list.append(prev_page)
for i in range(pager_start, pager_end+1):
self.params["page"] = i
if i == self.current_page_num:
temp = "<li class='active'><a href='?{}'>{}</a></li>".format(self.params.urlencode(),i)
else:
temp = "<li><a href='?{}'>{}</a></li>".format(self.params.urlencode(),i)
page_html_list.append(temp)
if self.current_page_num >= self.all_pager:
next_page = "<li class='disabled'><a herf='#'>下一页</a></li>"
else:
next_page = "<li><a href='?page={}'>下一页</a></li>" .format(self.current_page_num+1)
page_html_list.append(next_page)
last_page = '<li><a href="?page={}">尾页</a></li>' .format(self.all_pager)
page_html_list.append(last_page)
print(page_html_list)
return "".join(page_html_list)
html代码
<nav aria-label="Page navigation">
<ul class="pagination pull-right">
{{ pagination.page_html|safe }}
</ul>
</nav>
如何使用
from utils.page import Pagination
def news_list(request):
newses = News.objects.select_related('category','author').all()
page_num = request.GET.get('page')
count = newses.count()
pagination = Pagination(request,page_num,count,per_page_num=2,)
newses = newses[pagination.start:pagination.end]
context = {
'categories':NewsCategory.objects.all(),
'newses':newses,
'pagination':pagination
}
return render(request,'cms/news_list.html',context=context)