Django分页(二)
Django分页(二)
要求
# 1、设定每页显示数据条数 # # 2、用户输入页码(第一页、第二页...) # # 3、设定显示多少页号 # # 4、获取当前数据总条数 # # 5、根据设定显示多少页号和数据总条数计算出,总页数 # # 6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置 # # 7、在数据表中根据起始位置取值,页面上输出数据 # # 8、输出分页html,如:[上一页][1][2][3][4][5][下一页]
具体实现效果
css样式可以自行修改
示例
页面具体处理
# 参数: #数据总个数 #当前页 #每页显示多少条数据 #最多每页多个页号 class PageInfo(object): def __init__(self,totalCount,current,totalItem=12,peritems=10): #数据总个数 self._count=totalCount #当前页 try: v=int(current) if v<=0: v=1 self.__current=v except Exception as e: self.__current = 1 #每页显示的行数 self.__totalItem=totalItem #最多显示页面 self.__peritems = peritems #设置一页数据的开始和结束 #数据开始的页数 def start(self): return (self.__current-1)*self.__totalItem #数据结束的页数 def end(self): return self.__current*self.__totalItem #求出总页数 @property def num_pages(self): a,b=divmod(self._count,self.__totalItem) # print(a,b) if b==0: return a return a+1 #生成所有的页号 def page_num_range(self): # 当前页面 # self.current_page # 总页数 # self.num_pages # 最多显示的页码个数 # self.max_pager_num if self.num_pages < self.__peritems: return range(1, self.num_pages + 1) part = int( self.__peritems/ 2) if self.__current - part < 1: return range(1, self.__peritems + 1) if self.__current + part > self.num_pages: return range(self.num_pages + 1 - self.__peritems, self.num_pages + 1) return range(self.__current - part, self.__current + part + 1) #所有的a标签 def page_str(self): #用来存放所有页号a标签 page_list=[] #首页 head_page="<a href='/index3?p=1'>首页</a>" page_list.append(head_page) #上一页 print(self.__current) if self.__current ==1: prev="<a href='#'><<</a>" else: prev="<a href='/index3?p=%s'><<</a>"%(self.__current-1) page_list.append(prev) for i in self.page_num_range(): if i==self.__current: temp="<a style='font-size:30px;' href='/index3?p=%s'>%s</a>"%(i,i) else: temp="<a href='/index3?p=%s'>%s</a>"%(i,i) page_list.append(temp) #下一页 if self.__current==self.num_pages: next = "<a href='#'>>></a>" else: next = "<a href='/index3?p=%s'>>></a>" % (self.__current + 1) page_list.append(next) # 尾页 b_page="<a href='/index3?p=%s'>尾页</a>"%( self.num_pages) page_list.append(b_page) return ''.join(page_list)
视图函数
from django.shortcuts import render,HttpResponse,redirect from blog.models import * from blog import pager # Create your views here. USER_LIST=[] for i in range(666): temp={'name':'root'+str(i),'age':i} USER_LIST.append(temp) def get_index3(request): current_page=request.GET.get('p') #初始化页面处理的对象,有两个参数在初始化函数里,设置了默认数值 page_obj=pager.PageInfo(666,current_page) #对数据进行切片 data_list=USER_LIST[page_obj.start():page_obj.end()] return render(request,"index3.html",{'data_list':data_list,"page_obj":page_obj})
HTML
注意:safe在这里的作用。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> a{ border-style: solid ; } </style> </head> <body> <div class="header"> <div> {% for user in data_list %} <li>{{ user.name }} {{ user.age }} </li> {% endfor %} <br> {{ page_obj.page_str | safe }} </div> </div> </body> </html>