分页一(简单自定制):
url:http://127.0.0.1:8000/index/?p=1 >>>views.py USER_LIST = [] for i in range(1,999): temp = {'name':'root'+str(i),'age':i} USER_LIST.append(temp) def index(request): per_page_count = 10 current_page = request.GET.get('p') current_page = int(current_page) start = (current_page-1)*10 end = current_page*per_page_count data = USER_LIST[start:end] if current_page <= 1: prev_page = 1 else: prev_page = current_page - 1 if current_page >= (len(USER_LIST)//per_page_count) + 1: next_page = (len(USER_LIST)//per_page_count) + 1 else: next_page = current_page + 1 return render(request,'index.html',locals()) >>>html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for row in data %} <li>{{ row.name }}-{{ row.age }}</li> {% endfor %} </ul> <a href="/index/?p={{ prev_page }}">上一页</a> <a href="/index/?p={{ next_page }}">下一页</a> </body> </html>
分页二(内置模块):
USER_LIST = [] for i in range(1,999): temp = {'name':'root'+str(i),'age':i} USER_LIST.append(temp) >>>views def index1(request): from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger current_page = request.GET.get('p') paginator = Paginator(USER_LIST,10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: 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,'index1.html',locals()) >>>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> {% if posts.has_previous %} <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a> {% endif %} {% if posts.has_next %} <a href="/index1/?p={{ posts.next_page_number }}">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </body> </html>
分页三(内置模块扩展):
>>>views from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger USER_LIST = [] for i in range(1,666): temp = {'name':'root'+str(i),'age':i} USER_LIST.append(temp) class CustomPaginator(Paginator): def __init__(self,current_page,per_page_num,*args,**kwargs): #当前页 self.current_page = int(current_page) #最多显示的页码数量 self.per_page_num = int(per_page_num) super(CustomPaginator,self).__init__(*args,**kwargs) def page_num_page(self): #数据的总页数<设置显示的页数 就直接显示总的页数 if self.num_pages <self.per_page_num: return range(1,self.num_pages+1) #总页数特别多 part = int(self.per_page_num/2) if self.current_page <= part: return range(1,self.per_page_num+1) if (self.current_page + part) > self.num_pages: return range(self.num_pages-self.per_page_num+1,self.num_pages+1) return range(self.current_page-part,self.current_page+part+1) def index1(request): current_page = request.GET.get('p') paginator = CustomPaginator(current_page,7,USER_LIST,10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: 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,'index1.html',locals()) >>>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> {% if posts.has_previous %} <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a> {% endif %} {% for i in posts.paginator.page_num_page %}
{% if i == posts.number %} <a style="font-size: 30px" href="/index1/?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1/?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1/?p={{ posts.next_page_number }}">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </body> </html>
分页四(复杂自定制):
>>>pager.py class Pagination(object): #可调参数 perpageItemNum=10 每页显示的条数 #可调参数 maxPageNum=7 每次显示页数 #可调参数 totalCount=666 数据的总个数 def __init__(self,currentPage,totalCount=666,perpageItemNum=10,maxPageNum=7): #数据总个数 total_count # 当前页 current_page # 每页显示的条数 perpage_item_num # 每次显示页数 max_page_num 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.perpage_item_num = perpageItemNum self.max_page_num = maxPageNum # 当前页面的起始值 def start(self): #当前页数-1 * 显示的条数 return (self.current_page-1) * self.perpage_item_num # 当前页面的终止值 def end(self): # 当前页数 * 显示的条数 return self.current_page * self.perpage_item_num #总的页码数 @property #加了之后 可以直接调用self.num_pages 不需要再调用self.num_pages() def num_pages(self): a,b = divmod(self.total_count,self.perpage_item_num) if b == 0: return a return a+1 #现实的页面数跳动 def page_num_page(self): # 数据的总页数<设置显示的页数 就直接显示总的页数 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 + 1) return range(self.current_page - part, self.current_page + part + 1) #生成显示页面数字 def page_str(self): page_list =[] first = "<li><a href='/index2/?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/?p=%s'>上一页</a></li>"%(self.current_page-1) page_list.append(prev) for i in self.page_num_page(): if i == self.current_page: temp = "<li class='active'><a href='/index2/?p=%s'>%s</a></li>"%(i,i) else: temp = "<li><a href='/index2/?p=%s'>%s</a></li>" % (i, i) page_list.append(temp) if self.current_page == self.num_pages: nexts = "<li><a href='#'>下一页</a></li>" else: nexts = "<li><a href='/index2/?p=%s'>下一页</a></li>"%(self.current_page+1) page_list.append(nexts) last = "<li><a href='/index2/?p=%s'>尾页</a></li>"%self.num_pages page_list.append(last) return ''.join(page_list) >>>views def index2(request): from app1.pager import Pagination #获取用户点击发过来的请求页面 current_page = request.GET.get('p') page_obj = Pagination(current_page) data = USER_LIST[page_obj.start():page_obj.end()] return render(request,'index2.html',locals()) >>>html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css"> </head> <body> <ul> {% for row in data %} <li>{{ row.name }}-{{ row.age }}</li> {% endfor %} </ul> <ul class="pagination pagination-sm"> {{ page_obj.page_str|safe }} </ul> </body> </html>