Django之分页器
分页器推导
上面批量数据操作会让所有数据全部展示到一张页面上,基于上面的数据展示进行分页处理。每页展示几条
view.py
from django.shortcuts import render, HttpResponse, redirectfrom app01 import modelsdef index(request):data_queryset = models.Book.objects.all()current_page_num = request.GET.get('page')try:current_page_num = int(current_page_num)except Exception:current_page_num = 1if not current_page_num:current_page_num = 1# 每页展示几条数据per_page_num = 10# 起始位置start_num = (current_page_num - 1) * per_page_num# 终止位置stop_num = current_page_num * per_page_numbook_queryset = data_queryset[start_num:stop_num] # 顾头不顾尾"""per_page_num = 10current_page_num start_num stop_num1 0 102 10 203 20 30per_page_num = 5current_page_num start_num stop_num1 0 52 5 103 10 15规律:start_num = (current_page_num-1) * per_page_numend_num = current_page_num * per_page_num"""# 前端渲染的页面数量all_count = data_queryset.count()# 内置方法之 divmod()page_num, more = divmod(all_count, per_page_num)if more:page_num += 1html = ''high_light_pag = current_page_numif current_page_num < 6:current_page_num = 6for i in range(current_page_num - 5, current_page_num + 6):if high_light_pag == i:html += '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i)else:html += '<li><a href="?page=%s">%s</a></li>' % (i, i)return render(request, 'index.html', locals())
index.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><div class="text-center">{% for book_obj in book_queryset %}<p>{{ book_obj.title }}</p>{% endfor %}<nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>{{ html|safe }}<li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li></ul></nav></div></body></html>
分页器封装模块
创建一个utils目录,写好的封装摸块的放在这个位置方便引用
my_page.py
class Pagination(object):def __init__(self, current_page, all_count, per_page_num=10, pager_count=11):"""封装分页相关数据:param current_page: 当前页:param all_count: 数据库中的数据总条数:param per_page_num: 每页显示的数据条数:param pager_count: 最多显示的页码个数"""try:current_page = int(current_page)except Exception as e:current_page = 1if current_page < 1:current_page = 1self.current_page = current_pageself.all_count = all_countself.per_page_num = per_page_num# 总页码all_pager, tmp = divmod(all_count, per_page_num)if tmp:all_pager += 1self.all_pager = all_pagerself.pager_count = pager_countself.pager_count_half = int((pager_count - 1) / 2)@propertydef start(self):return (self.current_page - 1) * self.per_page_num@propertydef end(self):return self.current_page * self.per_page_numdef page_html(self):# 如果总页码 < 11个:if self.all_pager <= self.pager_count:pager_start = 1pager_end = self.all_pager + 1# 总页码 > 11else:# 当前页如果<=页面上最多显示11/2个页码if self.current_page <= self.pager_count_half:pager_start = 1pager_end = self.pager_count + 1# 当前页大于5else:# 页码翻到最后if (self.current_page + self.pager_count_half) > self.all_pager:pager_end = self.all_pager + 1pager_start = self.all_pager - self.pager_count + 1else:pager_start = self.current_page - self.pager_count_halfpager_end = self.current_page + self.pager_count_half + 1page_html_list = []# 添加前面的nav和ul标签page_html_list.append('''<nav aria-label='Page navigation>'<ul class='pagination'>''')first_page = '<li><a href="?page=%s">首页</a></li>' % (1)page_html_list.append(first_page)if self.current_page <= 1:prev_page = '<li class="disabled"><a href="#">上一页</a></li>'else:prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)page_html_list.append(prev_page)for i in range(pager_start, pager_end):if i == self.current_page:temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)else:temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)page_html_list.append(temp)if self.current_page >= self.all_pager:next_page = '<li class="disabled"><a href="#">下一页</a></li>'else:next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)page_html_list.append(next_page)last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)page_html_list.append(last_page)# 尾部添加标签page_html_list.append('''</nav></ul>''')return ''.join(page_html_list)
view.py
from django.shortcuts import renderfrom app01 import modelsdef index(request):from utils import my_pagebook_queryset = models.Book.objects.all()all_count = book_queryset.count()# 产生分页器对象page_obj = my_page.Pagination(current_page=request.GET.get('page'), all_count=all_count)# 产生分页数据对象page_queryset = book_queryset[page_obj.start:page_obj.end]return render(request, 'index.html', locals())
index.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><div class="text-center">{% for book_obj in page_queryset %}<p>{{ book_obj.title }}</p>{% endfor %}{{ page_obj.page_html|safe}}</div></body></html>
