Django-10-分页组件
1. Django内置分页
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range(1, 999): L.append(i) # Create your views here. def index(request): current_page = request.GET.get('p') # paginator对象 paginator = Paginator(L, 10) # 10表示每页显示10条 # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: # page对象 posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for item in posts.object_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if posts.has_previous %} <a href="/index.html?p={{ posts.previous_page_number }}">上一页</a> {% else %} <a href="#">上一页</a> {% endif %} {% if posts.has_next %} <a href="/index.html?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="#">下一页</a> {% endif %} <span>{{ posts.number }}/{{ posts.paginator.num_pages }}</span> </body> </html>
2. Django内置分页扩展
class CustomPaginator(Paginator): def __init__(self, current_page=1, max_page_num=7, *args, **kwargs): super(CustomPaginator, self).__init__(*args, **kwargs) self.current_page = int(current_page) self.max_page_num = max_page_num def page_num_range(self): # 总页数过少 if self.num_pages < self.max_page_num: return range(1, self.num_pages + 1) part = self.max_page_num // 2 if self.current_page - part < 1: return range(1, self.max_page_num + 1) if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_page_num, self.num_pages + 1) return range(self.current_page - part, self.current_page + part + 1) def index2(request): current_page = request.GET.get('p') try: # paginator对象 paginator = CustomPaginator(current_page, 11, L, 10) # 10表示每页显示10条 # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 except Exception: paginator = CustomPaginator(1, 11, L, 10) try: # page对象 posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index2.html', {'posts': posts})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for item in posts.object_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if posts.has_previous %} <a href="/index2.html?p={{ posts.previous_page_number }}">上一页</a> {% else %} <a href="#">上一页</a> {% endif %} {% for i in posts.paginator.page_num_range %} <a href="/index2.html?p={{ i }}">{{ i }}</a> {% endfor %} {% if posts.has_next %} <a href="/index2.html?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="#">下一页</a> {% endif %} <span>{{ posts.number }}/{{ posts.paginator.num_pages }}</span> </body> </html>
3. 自定义分页
class Paginator(object): def __init__(self, total_count, current_page, per_page_item_num=10, max_page_num=7): # 数据总个数 self.total_count = total_count # 当前页 try: v = int(current_page) if v <= 0: v = 1 self.current_page = v except Exception: self.current_page = 1 # 每页显示的行数 self.per_page_item_num = per_page_item_num # 最多显示页面 self.max_page_num = max_page_num def start(self): return (self.current_page - 1) * self.per_page_item_num def end(self): return self.current_page * self.per_page_item_num @property def num_pages(self): """ 总页数 :return: """ # 666 # 10 a, b = divmod(self.total_count, self.per_page_item_num) if b == 0: return a return a + 1 def page_num_range(self): if self.num_pages < self.max_page_num: return range(1, self.num_pages + 1) part = self.max_page_num // 2 if self.current_page - part < 1: return range(1, self.max_page_num + 1) if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_page_num, self.num_pages + 1) return range(self.current_page - part, self.current_page + part + 1) def page_str(self): page_list = [] first = "<li><a href='/index3.html?p=1'>首页</a></li>" page_list.append(first) if self.current_page == 1: prev = "<li><a href='#'>上一页</a></li>" else: prev = "<li><a href='/index3.html?p=%s'>上一页</a></li>" % (self.current_page - 1,) page_list.append(prev) for i in self.page_num_range(): if i == self.current_page: temp = "<li class='active'><a href='/index3.html?p=%s'>%s</a></li>" % (i, i) else: temp = "<li><a href='/index3.html?p=%s'>%s</a></li>" % (i, i) page_list.append(temp) if self.current_page == self.num_pages: nex = "<li><a href='#'>下一页</a></li>" else: nex = "<li><a href='/index3.html?p=%s'>下一页</a></li>" % (self.current_page + 1,) page_list.append(nex) last = "<li><a href='/index3.html?p=%s'>尾页</a></li>" % (self.num_pages,) page_list.append(last) return ''.join(page_list)
def index3(request): from app01.pager import Paginator current_page = request.GET.get('p') page_obj = Paginator(666, current_page) data = L[page_obj.start():page_obj.end()] return render(request, 'index3.html', locals())
<!DOCTYPE html> {% load staticfiles %} <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'plugin/bootstrap/css/bootstrap.css' %}"> </head> <body> <ul> {% for row in data %} <li>{{ row }}</li> {% endfor %} </ul> <ul class="pagination pagination-sm"> {{ page_obj.page_str|safe }} </ul> <div style="height: 300px;"></div> </body> </html>