自定义分页
自定义分页
准备知识点:
Python内置的@property装饰器就是负责把一个方法变成属性调用的:
class Person(object): def __init__(self,name,age): self.name = name self.age = age @property def show(self): # 把一段代码逻辑封装起来 if self.age > 18: return "上酒吧" else: return "上网吧" jassin = Person("jassin",18) # 实例化对象 print(jassin.name) # jassin print(jassin.show) # 上网吧
简单版分页
from django.shortcuts import render # Create your views here. # 去数据库数据 data = [] for i in range(1,302): tmp = {"id":i,"name":"lishi-{}".format(i)} data.append(tmp) def user_list(request): # 异常处理: 防止传的page不正常如字母 try: page_num = int(request.GET.get("page")) # http://127.0.0.1:8000/user_list/page=4 # 页面传输都是字符串,而下面需要该值来计算,所以要转成int except Exception as e: page_num = 1 # 没有传页码,默认展示第一页(上面的异常处理能解决) # if not page_num: # page_num = 1 # 每页显示10条数据 per_page_num = 10 # user_list = data[0:10] # 第一页 (1-1) *10 1*10 # user_list = data[10:20] # 第二页 (2-1) *10 2*10 # user_list = data[20:30] # 第三页 (n-1) *10 n*10 # 总数据个数(要显示的数据) total_count = len(data) # 总共有多少页 total_page_num 为总页数 当有more余数就得多加1页 total_page_num,more = divmod(total_count,per_page_num) if more: total_page_num += 1 # 如果你输入的页码数超过我的总页码,默认返回最后一页 if page_num > total_page_num: page_num = total_page_num # 去数据库取数据 start = (page_num-1) * per_page_num end = page_num * per_page_num user_list = data[start:end] # 最多显示多少页码(在页面的分页条,一般以奇数为主 max_show = 11 half_show = int((max_show-1)/2) # 页面上页码从哪开始 page_start = page_num - half_show # 页面上页码展示到哪一个 page_end = page_num + half_show # 如果当前页小于等于half_show,就默认从第一页展示到max_show if page_num <= half_show: page_start = 1 page_end = max_show # 如果当前页大于等于总页数-half_show if page_num >= total_page_num - half_show: page_end = total_page_num page_start = total_page_num - max_show # 生成前端页码的HTML page_html_list = [] # 放置一个首页按钮 page_first_tmp = '<li><a href="/user_list/?page=1">首页</a></li>' page_html_list.append(page_first_tmp) # 加一个上一页按钮 if page_num -1 <= 0: # 表示没有上一页 # page_prev_tmp = '<li><a href="#">上一页</a></li>' page_prev_tmp = '<li class="disable"><a href="#">上一页</a></li>' else: page_prev_tmp = '<li><a href="/user_list/?page={}">上一页</a></li>'.format(page_num-1) page_html_list.append(page_prev_tmp) for i in range(page_start,page_end+1): # 如果是当前页,就加一个active样式 if i == page_num: tmp = ' <li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i) else: tmp =' <li><a href="/user_list/?page={0}">{0}</a></li>'.format(i) page_html_list.append(tmp) # 添加一个下一页按钮 if page_num+1 > total_page_num: page_next_tmp = '<li class="disable"><a href="#">下一页</a></li>' else: page_next_tmp = '<li><a href="/user_list/?page={}">下一页</a></li>'.format(page_num + 1) page_html_list.append(page_next_tmp) # 添加一个尾页按钮 page_last_tmp = '<li><a href="/user_list/?page={}">尾页</a></li>'.format(total_page_num) page_html_list.append(page_last_tmp) page_html = "".join(page_html_list) # 把上面这些tmp拼接成一个大的字符串 return render(request,"user_list.html",{"user_list":user_list,"page_html":page_html})
搞成类进行调用
views
from django.shortcuts import render # Create your views here. # 去数据库数据 data = [] for i in range(1,302): tmp = {"id":i,"name":"lishi-{}".format(i)} data.append(tmp) def user_list(request): page_num = request.GET.get("page") path = request.path_info # 取得请求的url不带参数的 # request.get_full_path() # 带参数的URl from tools.mypage import MyPage page = MyPage(page_num,len(data),path) page_html = page.page_html() # return render(request,"user_list.html",{"user_list":data[page.start():page.end()]}) return render(request,"user_list.html",{"user_list":data[page.start:page.end],"page_html":page_html})
创个tools
class MyPage(object): def __init__(self,page_num,total_count,base_url,per_page_num=10,max_show=11): """ :param page_num: 当前页 :param total_count: 数据总个数 :param base_url: 分页页码跳转的URL (要实现动态传url :param per_page_num: 每一页显示多少条数据 :param max_show: 页面上最多显示多少页码 """ # 实例化传进来的参数 self.page_num = page_num try: self.page_num = int(page_num) # 字符串类型,所以要装为int except Exception as e: self.page_num = 1 self.total_count = total_count self.base_url = base_url self.per_page_num = per_page_num self.max_show = max_show # 根据传进来的参数,计算的几个值 self.half_show = int((self.max_show - 1)/2) # 总共有多少页 self.total_page_num,more = divmod(self.total_count,self.per_page_num) if more: self.total_page_num += 1 # 函数中的一些计算 #加这个装饰器 把一个方法变成属性调用的,方法调用需要加括号 @property def start(self): return (self.page_num - 1) * self.per_page_num @property def end(self): return self.page_num * self.per_page_num def page_html(self): """ 返回页面上可以用的一段HTML 一段可用的分页页码的html :return: """ # 页面上的页码从哪开始 page_start = self.page_num - self.half_show # 页面上的页码最多展示到哪个 page_end = self.page_num + self.half_show # 如果当前页小于等于half_show,就默认从第一页展示到max_show if self.page_num <= self.half_show: page_start = 1 page_end = self.max_show # 如果当前页大于等于总页数-half_show if self.page_num >= self.total_page_num - self.half_show: page_end = self.total_page_num page_start = self.total_page_num - self.max_show # 生成前端页码的HTML page_html_list = [] # 放置一个首页按钮 page_first_tmp = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url) page_html_list.append(page_first_tmp) # 加一个上一页按钮 if self.page_num -1 <= 0: # 表示没有上一页 # page_prev_tmp = '<li><a href="#">上一页</a></li>' page_prev_tmp = '<li class="disable"><a href="#">上一页</a></li>' else: page_prev_tmp = '<li><a href="{0}?page={1}">上一页</a></li>'.format(self.base_url,self.page_num-1) page_html_list.append(page_prev_tmp) for i in range(page_start,page_end+1): # 如果是当前页,就加一个active样式,生成的是分页条哪到哪 if i == self.page_num: tmp = ' <li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url,i) else: tmp =' <li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url,i) page_html_list.append(tmp) # 添加一个下一页按钮 if self.page_num+1 > self.total_page_num: page_next_tmp = '<li class="disable"><a href="#">下一页</a></li>' else: page_next_tmp = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url,self.page_num+1) page_html_list.append(page_next_tmp) # 添加一个尾页按钮 page_last_tmp = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url,self.total_page_num) page_html_list.append(page_last_tmp) return "".join(page_html_list) # 把上面这些tmp拼接成一个大的字符串