django基础(四)- 分页组件
一、django内置分页
django内置分页使用到两个类:Paginator,Page
主要有如下方法及参数:
#paginator对象 paginator = Paginator(L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 #page对象 posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象
--------------------------------------------------------------------------------------------------------
可以CustomPaginator(Paginator),创建自己独特的方法
需要传入的数据:
- 所有数据
- 当前页
- 每页显示的条目数
- 最多页面个数
view.py文件内容:
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger USER_LIST = [] for i in range(1,300): temp = {'name':'root'+str(i),'age':i} USER_LIST.append(temp) # def index(request): # per_page_count = 10 # current_page = int(request.GET.get('p')) # # start = (current_page-1)*per_page_count # end = current_page * per_page_count # data = USER_LIST[start:end] # # prev_pager = current_page - 1 # next_pager = current_page + 1 # return render(request,'index.html',{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager}) # def index1(request): # current_page = request.GET.get('p') #获取当前的页码 # paginator = Paginator(USER_LIST,10) #Paginator实例化对象 # # try: # posts = paginator.page(current_page) #当前页面实例化page对象 # except PageNotAnInteger: #如果输入的不是整数 # posts = paginator.page(1) #第一页 # except EmptyPage: #后面没有页码了 # posts = paginator.page(paginator.num_pages) #最后一页 # return render(request,'index1.html',{'posts': posts}) class CustomPaginator(Paginator): #继承,自定义方法 def __init__(self,current_page,per_pager_num,*args,**kwargs): super(CustomPaginator,self).__init__(*args,**kwargs) #当前页 self.current_page=int(current_page) #最多显示的页码数量 self.per_pager_num=int(per_pager_num) def pager_num_range(self): #当前页:self.current_page #最多显示的页码数量:self.per_pager_num #总页数:self.num_pages if self.num_pages < self.per_pager_num: return range(1,self.num_pages+1) #当总页数很多时 part = int(self.per_pager_num/2) if self.current_page <= part: return range(1,self.per_pager_num+1) if (self.current_page + part) > self.num_pages: return range(self.num_pages-self.per_pager_num+1,self.num_pages) return range(self.current_page-part,self.current_page+part+1) def index1(request): current_page = request.GET.get('p') paginator = CustomPaginator(current_page,11,USER_LIST,10) try: posts = paginator.page(current_page) except PageNotAnInteger: posts = paginator.page(1) #第一页 except EmptyPage: posts = paginator.page(paginator.num_pages) #最后一页 return render(request,'index1.html',{'posts': posts})
index1.html文件内容:
#index1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for row in posts.object_list %} <li>{{ row.name }}-{{ row.age }}</li> {% endfor %} </ul> {% include 'include/pager.html' %} </body> </html> #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #pager.html {% if posts.has_previous %} <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a> {% else %} <a href="#">上一页</a> {% endif %} {% for i in posts.paginator.pager_num_range %} {% if i == posts.number %} <a style="color: red" href="/index1.html?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1.html?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="#">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span>
效果:
二、自定义分页
不使用django内置组件,自己单独创建类
需要传入的数据:
- 所有数据的个数
- 当前页
- 每页显示条目数
- 最多页面个数
pager.py文件:
class Pagination(object): def __init__(self,totalCount,currentPage,perPageItemNum=20,maxPageNum=7): #数据总个数 self.total_count = totalCount #当前页 try: v = int(currentPage) if v <=0: v=1 self.current_page = v except Exception as e: self.current_page = 1 #每页显示的条数 self.per_page_item_num = perPageItemNum #最多显示的页码 self.max_page_num = maxPageNum 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): #总页数 a,b=divmod(self.total_count,self.per_page_item_num) #divmod(10,3) ==>(3, 1) if b==0: return a return a+1 def pager_num_range(self): #当前页:self.current_page #最多显示的页码数量:self.per_pager_num #总页数:self.num_pages if self.num_pages < self.max_page_num: return range(1,self.num_pages+1) #当总页数很多时 part = int(self.max_page_num/2) if self.current_page <= part: return range(1,self.max_page_num+1) if (self.current_page + part) > self.num_pages: return range(self.num_pages-self.max_page_num+1,self.num_pages) return range(self.current_page-part,self.current_page+part+1) def page_str(self): page_list=[] #首页 first = "<li><a href='/index2.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='/index2.html?p=%s'>上一页</a></li>" %(self.current_page-1) page_list.append(prev) for i in self.pager_num_range(): if i == self.current_page: temp = "<li class='active'><a class='active' href='/index2.html?p=%s'>%s</a></li>" %(i,i) else: temp = "<li><a href='/index2.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='/index2.html?p=%s'>下一页</a></li>" %(self.current_page+1) page_list.append(nex) last = "<li><a href='/index2.html?p=%s'>尾页</a></li>" %self.num_pages page_list.append(last) return ' '.join(page_list)
html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"/> </head> <body> <ul> {% for row in data %} <li>{{ row.name }}-{{ row.age }}</li> {% endfor %} {# {% for i in page_obj.pager_num_range %}#} {# <a href="/index2.html?p={{ i }}">{{ i }}</a>#} {# {% endfor %}#} {# <hr/>#} </ul> <ul class="pagination"> {{ page_obj.page_str|safe }} </ul> </body> </html>
view.py文件:
def index2(request): from app01.pager import Pagination current_page = request.GET.get('p') page_obj = Pagination(300,current_page) data_list = USER_LIST[page_obj.start():page_obj.end()] return render(request,'index2.html',{'data':data_list,'page_obj':page_obj})
效果:
作者:Lawrence
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
扫描上面二维码关注我
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.