分页组件
分页组件
1 2.分页组件 2 -Django内置分页 3 -Paginator, Page 4 -页面:调用时用include,避免重复代码 5 -扩展Django的内置分页 6 -class CustomPaginator(Paginator) 7 8 传入: 9 -所有数据 10 -当前页 11 -每页显示30条 12 -最多页面7个 13 14 -自定义分页 15 传入: 16 -所有数据的个数 17 -当前页 18 -每页显示30条 19 -最多页面7个
粗劣的分页:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.shortcuts import render,HttpResponse 2 3 # Create your views here. 4 from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger 5 6 USER_LIST = [] 7 for i in range(1,666): 8 temp = {'name':'root'+str(i),'age':i} 9 USER_LIST.append(temp) 10 11 def index(request): 12 per_page_count = 10 13 current_page = request.GET.get('p') 14 current_page = int(current_page) 15 16 start = (current_page-1) * per_page_count 17 end = current_page * per_page_count 18 data = USER_LIST[start:end] 19 prev_pager = current_page - 1 20 next_pager = current_page + 1 21 if len(USER_LIST) % per_page_count: 22 sum_pages = len(USER_LIST) // per_page_count + 1 23 else: 24 sum_pages = len(USER_LIST) // per_page_count 25 if current_page <= 1: 26 prev_pager = 1 27 if current_page == sum_pages: 28 next_pager = current_page 29 return render(request,"index.html",{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager})
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <ul> 9 {% for row in user_list %} 10 <li>{{ row.name }}-{{ row.age }}</li> 11 {% endfor %} 12 </ul> 13 <a href="/index.html?p={{ prev_pager }}">上一页</a> 14 <a href="/index.html?p={{ next_pager }}">下一页</a> 15 </body> 16 </html>
Django内置分页组建及扩展
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.shortcuts import render,HttpResponse 2 3 # Create your views here. 4 from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger 5 6 USER_LIST = [] 7 for i in range(1,666): 8 temp = {'name':'root'+str(i),'age':i} 9 USER_LIST.append(temp) 10 11 def index(request): 12 per_page_count = 10 13 current_page = request.GET.get('p') 14 current_page = int(current_page) 15 16 start = (current_page-1) * per_page_count 17 end = current_page * per_page_count 18 data = USER_LIST[start:end] 19 prev_pager = current_page - 1 20 next_pager = current_page + 1 21 if len(USER_LIST) % per_page_count: 22 sum_pages = len(USER_LIST) // per_page_count + 1 23 else: 24 sum_pages = len(USER_LIST) // per_page_count 25 if current_page <= 1: 26 prev_pager = 1 27 if current_page == sum_pages: 28 next_pager = current_page 29 return render(request,"index.html",{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager}) 30 31 class CustomPaginator(Paginator): 32 def __init__(self,current_page,per_pager_num,*args,**kwargs): 33 self.current_page = int(current_page) 34 self.per_pager_num = int(per_pager_num) 35 super(CustomPaginator,self).__init__(*args,**kwargs) 36 def pager_num_range(self): 37 if self.num_pages < self.per_pager_num: 38 return range(1,self.num_pages+1) 39 40 part = int(self.per_pager_num/2) 41 if self.current_page <= part: 42 return range(1,self.per_pager_num+1) 43 if (self.current_page+part) > self.num_pages: 44 return range(self.num_pages-self.per_pager_num+1,self.num_pages+1) 45 return range(self.current_page-part,self.current_page+part+1) 46 47 def index1(request): 48 #Django内置的page分页 49 #from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger 50 current_page = request.GET.get('p') 51 paginator = CustomPaginator(current_page,11,USER_LIST,10) 52 print(paginator.per_page)# per_page: 每页显示条目数量 53 print(paginator.count)# count: 数据总个数 54 print(paginator.num_pages)# num_pages:总页数 55 print(paginator.page_range)# page_range:总页数的索引范围,如: (1,10),(1,200) 56 # page: page对象(是否具有下一页,是否具有上一页) 57 try: 58 posts = paginator.page(current_page) 59 print(posts.has_next())# has_next 是否有下一页 60 print(posts.next_page_number())# next_page_number 下一页页码 61 print(posts.has_previous())# has_previous 是否有上一页 62 print(posts.previous_page_number())# previous_page_number 上一页页码 63 # object_list 分页之后的数据列表 64 # number 当前页 65 # paginator paginator对象 66 except PageNotAnInteger: 67 posts = paginator.page(1) 68 except EmptyPage: 69 posts = paginator.page(paginator.num_pages) 70 return render(request,"index1.html",{'posts':posts})
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <ul> 9 {% for row in posts.object_list %} 10 <li>{{ row.name }}-{{ row.age }}</li> 11 {% endfor %} 12 </ul> 13 {% include 'include/pager.html' %} 14 </body> 15 </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 {% if posts.has_previous %} 2 <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a> 3 {% endif %} 4 5 {% for i in posts.paginator.pager_num_range %} 6 {% if i == posts.number %} 7 <a style="color: red;" href="/index1.html?p={{ i }}">{{ i }}</a> 8 {% else %} 9 <a href="/index1.html?p={{ i }}">{{ i }}</a> 10 {% endif %} 11 {% endfor %} 12 13 {% if posts.has_next %} 14 <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a> 15 {% endif %} 16 17 <span> 18 {{ posts.number }}//{{ posts.paginator.num_pages }} 19 </span>
自定义分页:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def index2(request): 2 from APP01.pager import Pagination 3 current_page = request.GET.get('p') 4 page_obj = Pagination(666,current_page) 5 data_list = USER_LIST[page_obj.start():page_obj.end()] 6 7 return render(request,"index2.html",{'data':data_list,'page_obj':page_obj})
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <link rel="stylesheet" href="/static/bootstrap-4.1.3-dist/css/bootstrap.css"> 8 <body> 9 <ul> 10 {% for row in data %} 11 <li>{{ row.name }}-{{ row.age }}</li> 12 {% endfor %} 13 </ul> 14 {% for i in page_obj.pager_num_range %} 15 <a href="/index2.html?p={{ i }}">{{ i }}</a> 16 {% endfor %} 17 <hr> 18 {{ page_obj.page_str|safe }} 19 20 <ul class="pagination"> 21 <li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li> 22 <li><a href="#">1</a></li> 23 <li><a href="#">2</a></li> 24 <li><a href="#">3</a></li> 25 <li><a href="#">4</a></li> 26 <li><a href="#">5</a></li> 27 <li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li> 28 </ul> 29 </body> 30 </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Pagination(object): 2 def __init__(self,totalCount,currentPage,perPageItemNum=30,maxPageNum=7): 3 #数据总数 4 self.total_count = totalCount 5 #当前页 6 try: #防止用户输入错误 7 v = int(currentPage) 8 if v <= 0: #判断若输入为负数时处理 9 v = 1 10 self.current_page = v 11 except Exception as e: 12 self.current_page = 1 13 #每页显示的行数 14 self.per_page_item_num = perPageItemNum 15 #最多显示页 16 self.max_page_num = maxPageNum 17 18 def start(self): 19 return (self.current_page-1) * self.per_page_item_num 20 21 def end(self): 22 return self.current_page * self.per_page_item_num 23 @property 24 def num_pages(self): 25 """ 26 总页数 27 """ 28 a,b = divmod(self.total_count,self.per_page_item_num) 29 if b == 0: 30 return a 31 return a+1 32 33 def pager_num_range(self): 34 #return range(1,12) 直接定死页码数量和显示 35 if self.num_pages < self.max_page_num: 36 return range(1,self.num_pages+1) 37 part = int(self.max_page_num/2) 38 if self.current_page <= part: 39 return range(1,self.max_page_num+1) 40 if (self.current_page+part) > self.num_pages: 41 return range(self.num_pages-self.max_page_num+1,self.num_pages+1) 42 return range(self.current_page-part,self.current_page+part+1) 43 44 def page_str(self): 45 page_list = [] 46 #首页 47 first = "<a href='/index2.html?p=1'>首页</a>" 48 page_list.append(first) 49 #上一页 50 if self.current_page == 1: 51 prev = "<a href='#'>上一页</a>" 52 else: 53 prev = "<a href='/index2.html?p=%s'>上一页</a>" % (self.current_page-1) 54 page_list.append(prev) 55 #中间页码 56 for i in self.pager_num_range(): 57 if i == self.current_page: 58 temp = "<a style='color:red' href='/index2.html?p=%s'>%s</a>" % (i,i) 59 else: 60 temp = "<a href='/index2.html?p=%s'>%s</a>" % (i,i) 61 page_list.append(temp) 62 #下一页 63 if self.current_page == self.num_pages: 64 next = "<a href='#'>下一页</a>" 65 else: 66 next = "<a href='/index2.html?p=%s'>下一页</a>" % (self.current_page+1) 67 page_list.append(next) 68 #末页 69 last = "<a href='/index2.html?p=%s'>末页</a>" % self.num_pages 70 page_list.append(last) 71 72 return ''.join(page_list)