views.py函数 :
# 测试数据
obj_data = [{"name": "wang{}".format(i), "pwd": "dong{}".format(i)} for i in range(1, 302)]
def page(request): page = Pagination(request, len(obj_data)) return render(request, "page.html", { "obj": obj_data[page.start(): page.end()], # "page_num": range(start_page, end_page +1) "html_str": page.show_li() })
封装成函数版本 :
""" 分页器 """ from django.utils.safestring import mark_safe class Pagination: def __init__(self, request, all_data, data_num=10, max_page=5): # 当前页面数, 异常处理防止越界操作(page等于字符串或负数) self.base_url = request.path_info try: self.now_page = int(request.GET.get("page", 1)) if self.now_page <= 0: self.now_page = 1 except Exception as e: self.now_page = 1 # 每页显示的数据量 self.data_num = data_num # 总数据量 self.all_data = all_data # 总页码数 self.page_num, more = divmod(all_data, data_num) if more: self.page_num += 1 # 单次最多显示的页码数 self.max_page = max_page # 最大页码数的一半 half_max_page = max_page // 2 # 数据的总页码数不足设置的最大单次显示页码数 if self.page_num <= max_page: self.start_page = 1 self.end_page = self.page_num else: # 数据的总页码数大于设置的最大单次显示页码数 if self.now_page <= half_max_page: self.start_page = 1 self.end_page = max_page elif self.now_page + half_max_page >= self.page_num: self.start_page = self.page_num - max_page + 1 self.end_page = self.page_num else: self.start_page = self.now_page - half_max_page self.end_page = self.now_page + half_max_page def start(self): return (self.now_page - 1) * self.data_num def end(self): return self.now_page * self.data_num def show_li(self): # 放html标签的列表 html_list = [] # 首页显示按钮 first_li = "<li><a href='{}?page=1'>首页</a></li>".format(self.base_url) html_list.append(first_li) # 如果当前页码是第一页, 则上一页按键禁用 if self.now_page == 1: before_li = "<li class='disabled'><a href='{1}?page={0}'><<</a></li>".format(self.now_page - 1, self.base_url) # 上一页 else: # 当前页码不是第一页, 正常显示 before_li = "<li><a href='{1}?page={0}'><<</a></li>".format(self.now_page - 1, self.base_url) # 上一页 html_list.append(before_li) # 对起始页码到终止页码for循环 for num in range(self.start_page, self.end_page + 1): if num == self.now_page: li_html = "<li class = 'active'><a href='{1}?page={0}'>{0}</a></li>".format(num, self.base_url) else: li_html = "<li><a href='{1}?page={0}'>{0}</a></li>".format(num, self.base_url) html_list.append(li_html) # 如果当前页码是最后一页, 下一页按键禁用 if self.now_page == self.page_num: next_li = "<li class='disabled'><a href='{1}?page={0}'>>></a></li>".format(self.now_page + 1, self.base_url) # 下一页 else: # 非最后一页, 正常显示 next_li = "<li><a href='{1}?page={0}'>>></a></li>".format(self.now_page + 1, self.base_url) # 下一页 html_list.append(next_li) # 加尾页显示按钮 last_li = "<li><a href='{1}?page={0}'>尾页</a></li>".format(self.page_num, self.base_url) # 将定义好的标签放入列表 html_list.append(last_li) # 将列表使用""组合成字符串 return mark_safe("".join(html_list))
直接写成函数版本 :
def page(request): # # 当前页面数, 异常处理防止越界操作(page等于字符串或负数) # try: # now_page = int(request.GET.get("page", 1)) # if now_page <= 0: # now_page = 1 # except Exception as e: # now_page = 1 # # 每页显示的数据量 # data_num = 10 # # 总数据量 # all_data = len(obj_data) # # 总页码数 # page_num, more = divmod(all_data, data_num) # if more: # page_num += 1 # # 单次最多显示的页码数 # max_page = 5 # # 最大页码数的一半 # half_max_page = max_page // 2 # # 数据的总页码数不足设置的最大单次显示页码数 # if page_num <= max_page: # start_page = 1 # end_page = page_num # else: # # 数据的总页码数大于设置的最大单次显示页码数 # if now_page <= half_max_page: # start_page = 1 # end_page = max_page # elif now_page + half_max_page >= page_num: # start_page = page_num - max_page +1 # end_page = page_num # else: # start_page = now_page - half_max_page # end_page = now_page + half_max_page # # # 放html标签的列表 # html_list = [] # # 首页显示按钮 # first_li = "<li><a href='/page/?page=1'>首页</a></li>" # html_list.append(first_li) # # 如果当前页码是第一页, 则上一页按键禁用 # if now_page == 1: # before_li = "<li class='disabled'><a href='/page/?page={0}'><<</a></li>".format(now_page - 1) # 上一页 # else: # 当前页码不是第一页, 正常显示 # before_li = "<li><a href='/page/?page={0}'><<</a></li>".format(now_page - 1) # 上一页 # html_list.append(before_li) # # 对起始页码到终止页码for循环 # for num in range(start_page, end_page + 1): # if num == now_page: # li_html = "<li class = 'active'><a href='/page/?page={0}'>{0}</a></li>".format(num) # else: # li_html = "<li><a href='/page/?page={0}'>{0}</a></li>".format(num) # html_list.append(li_html) # # 如果当前页码是最后一页, 下一页按键禁用 # if now_page == page_num: # next_li = "<li class='disabled'><a href='/page/?page={0}'>>></a></li>".format(now_page + 1) # 下一页 # else: # 非最后一页, 正常显示 # next_li = "<li><a href='/page/?page={0}'>>></a></li>".format(now_page + 1) # 下一页 # html_list.append(next_li) # # 加尾页显示按钮 # last_li = "<li><a href='/page/?page={}'>尾页</a></li>".format(page_num) # # 将定义好的标签放入列表 # html_list.append(last_li) # # 将列表使用""组合成字符串 # html_str = "".join(html_list) # # # 使用切片的方法将数据放入不同的页面 # # 切片的起始值 # start_split = (now_page - 1) * data_num # # 终止值 # end_split = now_page * data_num return render(request, "page.html", { "page_num": range(start_page, end_page +1) # FBV版 "html_str": page.show_li() })