分页
分页开始
第一部分
伪造数据,第一图为显示所有数据,第二图为按照自定义显示数据,传给前端进行渲染

后端 from django.shortcuts import render 显示所有数据: HOST_LIST = [] # 数据库没数据,伪造数据 for i in range(1,150): HOST_LIST.append("c%s.com" %i ) def hosts(request): return render(request,'hosts.html',{'host_list':HOST_LIST}) 显示十条数据: HOST_LIST = [] # 数据库没数据,伪造数据 for i in range(1,150): HOST_LIST.append("c%s.com" %i ) def hosts(request): #每页显示十条数据 host_list = HOST_LIST[0:10] return render(request,'hosts.html',{'host_list':HOST_LIST}) 前端 # 取出所有数据 <ul> {% for item in host_list %} <li>{{ item }}</li> {% endfor %} </ul>
第二部分
把用户看到的页码传出去,计算在数据库中获取的数据

HOST_LIST = [] for i in range(1,104): HOST_LIST.append("c%s.com" %i ) def hosts(request): #用户请求的当前页 current_page = int(request.GET.get("page")) # 每页显示10条数据 per_page_count = 10 # 根据用户请求的数据,把切片的数据拿出来 start = (current_page - 1) * per_page_count end = current_page * per_page_count host_list =HOST_LIST[start:end] # 第一页 return render(request,'hosts.html',{'host_list':host_list})
第三部分
让用户看的舒服些,写上可以点的a标签


def host(request): try: current_page = int(request.GET.get("page",1)) except Exception: current_page =1 per_page_count = 10 start = (current_page -1) * per_page_count end = current_page * per_page_count host_list = Host_list[start:end] #数据总条数 total_count = len(Host_list) #页面显示的最大页码 max_page_num,div = divmod(total_count,per_page_count) if div: max_page_num += 1 # 有余数所以+1 page_html_list = [] for i in range(1,max_page_num +1): # range取不到最后一个,所有需要+1 if i == current_page: temp = '<a class="active" href="/hosts/?page=%s">%s</a>'%(i,i) else: temp = '<a href="/hosts/?page=%s">%s</a>' % (i, i) page_html_list.append(temp) page_html = "".join(page_html_list) return render(request,"host_list.html",{"host_list":host_list,"page_html":page_html})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .pager a{ display: inline-block; padding: 2px 8px; margin: 0 5px; border: 1px solid cadetblue; } .pager a.active{ background-color: green; color: white; } </style> </head> <body> <ul> {% for item in host_list %} <li>{{ item }}</li> {% endfor %} </ul> <div class="pager"> {{ page_html|safe }} </div> </body> </html>
第四部分
数据庞大的时候会出现如图问题,显示指定页码和解决左右与页码的极限问题


from django.shortcuts import render HOST_LIST = [] for i in range(1,852): HOST_LIST.append("c%s.com" %i ) def hosts(request): current_page = int(request.GET.get("page")) per_page_count = 10 start = (current_page -1) * per_page_count end = current_page * per_page_count host_list = HOST_LIST[start:end] #数据总条数 total_count = len(HOST_LIST) #页面显示的最大页码 max_page_num,div = divmod(total_count,per_page_count) if div: max_page_num += 1 # 最大页码的个数 max_page_count = 11 half_max_pager_count = int((max_page_count-1) /2) #如果总页数 < 11 if max_page_num <= max_page_count: pager_start = 1 pager_end = max_page_num else: # 如果当前页 <= 5,判断最小值 if current_page <= half_max_pager_count: pager_start = 1 pager_end = max_page_count else: # 当前页 + 5 > 总页码 判断最大值 if (current_page + half_max_pager_count) > max_page_num: pager_start = max_page_num - max_page_count +1 pager_end = max_page_num else: pager_start = current_page - half_max_pager_count pager_end = current_page + half_max_pager_count page_html_list = [] for i in range(pager_start,pager_end +1): if i == current_page: temp = '<a class="active" href="/hosts/?page=%s">%s</a>'%(i,i,) else: temp = '<a href="/hosts/?page=%s">%s</a>' % (i, i,) page_html_list.append(temp) page_html = "".join(page_html_list) return render(request,"hosts.html",{"host_list":host_list,"page_html":page_html})
第五部分
最终生成页码时,做一次封装,创建一个模块,如果想封装,以后写类的时候,想要start值,需要根据某种计算结果得到
""" 自定义分页组件的使用方法: page_obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info) user_list = USER_LIST[page_obj.start:page_obj.end] html = page_obj.page_html() return render(request,"users.html",{"user_list":user_list,"page_html":html}) """ class Pagination(object): """ 自定义分页 """ def __init__(self,current_page,total_count,base_url,per_pager_count=10,max_pager_count = 11): #处理当前页 try: current_page = int(current_page) except Exception as e: current_page =1 if current_page <= 0: current_page = 1 self.current_page = current_page #数据总条数 self.total_count = total_count #每页显示自定义数据条数 self.per_pager_count = per_pager_count # 页面显示的最大页码 max_page_num, div = divmod(total_count, per_pager_count) if div: max_page_num += 1 self.max_page_num = max_page_num # 页面默认显示11个页面(当前页在中间) self.max_pager_count = max_pager_count self.half_max_pager_count = int((max_pager_count - 1) / 2) #前缀 self.base_url = base_url @property def start(self): return (self.current_page - 1) * self.per_pager_count @property def end(self): return self.current_page * self.per_pager_count def page_html(self): # 如果总页数 < 11 if self.max_page_num <= self.max_pager_count: pager_start = 1 pager_end = self.max_page_num else: # 如果当前页 <= 5,判断最小值 if self.current_page <= self.half_max_pager_count: pager_start = 1 pager_end = self.max_pager_count else: # 当前页 + 5 > 总页码 判断最大值 if (self.current_page + self.half_max_pager_count) > self.max_page_num: pager_start = self.max_page_num - self.max_pager_count + 1 pager_end = self.max_page_num else: pager_start = self.current_page - self.half_max_pager_count pager_end = self.current_page + self.half_max_pager_count page_html_list = [] for i in range(pager_start, pager_end + 1): if i == self.current_page: temp = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url,i, i,) else: temp = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i,) page_html_list.append(temp) return "".join(page_html_list)
from django.shortcuts import render HOST_LIST = [] for i in range(1,852): HOST_LIST.append("c%s.com" %i ) from utils.pager import Pagination def hosts(request): # 表示把所有的值都封装到对象里 page_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info) # request.path_info 获取当前url # 把数据库的数据切出来 host_list = HOST_LIST[page_obj.start:page_obj.end] html = page_obj.page_html() return render(request,"hosts.html",{"host_list":host_list,"page_html":html}) USER_LIST =[] for i in range(1,302): USER_LIST.append("bb%s" %i ) def users(request): page_obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info) user_list = USER_LIST[page_obj.start:page_obj.end] html = page_obj.page_html() return render(request,"users.html",{"user_list":user_list,"page_html":html})
首页与尾页设定


#首页设定 first_page = '<a href="%s?page=%s">首页</a>' % (self.base_url,1,) page_html_list.append(first_page) for i in range(pager_start, pager_end + 1): if i == self.current_page: temp = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url,i, i,) else: temp = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i,) page_html_list.append(temp) #尾页设定 last_page = '<a href="%s?page=%s">尾页</a>' % (self.base_url, self.max_page_num,) page_html_list.append(last_page)

浙公网安备 33010602011771号