1.自带的Django 分页器。
使用的是publish_list中的代码:
模板函数代中的代码:
<div class="col-lg-8 col-lg-offset-4"> <nav aria-label="Page navigation"> <ul class="pagination"> <li><a href="?page=1">首页</a></li> {% if page.has_previous %} <li><a href="?page={{ page.previous_page_number }}">上一页</a></li> {% else %} <li class="disabled"><a href="javascript:void(0);">上一页</a></li> {% endif %} {# 方式二一旦把paginator 显示的条数改小之后就会出现错误,于是在后端就行限制page_range再传过来#} {# 方式一有缺陷的 {% for num in paginator.page_range %}#} {% for num in page_range %} {% if current_page == num %} <li class="active"><a href="?page={{ num }}">{{ num }}</a></li> {% else %} <li><a href="?page={{ num }}">{{ num }}</a></li> {% endif %} {% endfor %} {% if page.has_next %} <li><a href="?page={{ page.next_page_number }}">下一页</a></li> {% else %} <li class="disabled"><a href="javascript:void(0);">下一页</a></li> {% endif %} <li><a href="?page={{ paginator.num_pages }}">尾页</a></li> </ul> </nav> </div>
视图函数代码:
# 出版社的展示 @login_required def publish_list(request): # 创建publish数据 # 本次创建数据的效率较低 # for i in range(1, 101): # models.Publish.objects.create(name="希望出版社_%s" % i, city="成都_%s区" % i, email="[email protected]") # 执行效率低 publish_list = models.Publish.objects.all() paginator = Paginator(publish_list, 8)
# 防止第一次输入publish_list的时候,没有page导致错误,于是有了try 和excepttion 如果没有设置那么current_page = 1 try: current_page = int(request.GET.get("page")) except Exception as e: current_page = 1 page = paginator.get_page(current_page) # 获取当前页码的所有数据 # 为防止就行每次显示条数改小之后,出现太多的paginator.page_range从而显示在页面上,就行下面的设置 # 我们按照页面显示11个页码为例。 # 如果总页码大于11 # 第一步 if paginator.num_pages > 11: if current_page - 5 < 1: # 当前页小于中间页码时 page_range = range(1, 12) elif current_page + 5 > paginator.num_pages: # 当前页大于中间页码时 page_range = range(paginator.num_pages - 10, paginator.num_pages + 1) else: page_range = range(current_page - 5, current_page + 6) else: page_range = paginator.page_range # 第二步 将对应的模板中的paginator.page_range改成page_range即可, return render(request, "publish_list.html", {"paginator": paginator, "page": page, "current_page": current_page, "page_range": page_range})
2.终极版的模板函数代码:在图书管理系统中是使用的book_list.来实现的。视图函数是book_list_base,之前使用过模板继承的,携带参数。
<table class="table table-striped table-hover"> <thead> <tr> <th>序号</th> <th>书名</th> <th>价格</th> <th>出版社</th> <th>作者</th> <th>出版时间</th> <th>编辑</th> </tr> </thead> <tbody> {% for book in book_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ book.title }}</td> <td>{{ book.price }}</td> <td>{{ book.publish.name }}</td> <td> {% for au in book.authors.all %} {{ au.name }} | {% endfor %} </td> <td> {{ book.pub_date|date:'Y-m-d' }} </td> <td> <button class="btn btn-danger btn-xs del_btn" book_pk="{{ book.pk }}">删除</button> | <button class="btn btn-info btn-xs"><a href="http://127.0.0.1:8000/edit_book_list/?pk={{ book.pk }}">编辑</a></button> </td> </tr> {% endfor %} </tbody> </table> <div class="col-lg-8 col-lg-offset-4"> {{ paginator.page_html|safe }} </div>
其中分页的html文件是通过后端的类实现创建好的代码,传过来的。
视图函数中的代码:
利用作者展示部分就行,最终版的展示 @login_required def author_book(request): # is_login = request.session.get('is_login') # if not is_login: # return redirect("/login/") author_list = models.Author.objects.all() # 先创建AuthorDetail.数据 # 本次创建数据的效率较低 # for i in range(10, 110): # models.AuthorDetail.objects.create(gender=random.randrange(0, 2), tel=18228069171, addr="成都", birthday="2019-07-18") # 第二步再创建Author数据 # for i in range(10, 110): # models.Author.objects.create(name="芒果鱼_%s" % i, age=random.randrange(10, 30), au_detail_id=i) from app01.zhongji import Paginator current_page = request.GET.get('page') paginator = Paginator(request, current_page, author_list.count(), 8, 11) book_list = author_list[paginator.start: paginator.end] return render(request, "author_list.html", {"author_list": book_list, "paginator": paginator, "current_page": current_page}) # return render(request, "author_list.html", {'author_list': author_list})# 之前的没使用分页就行全部展示的返回值
视图函数中传入的参数。
其中类文件,zhongji.py代码:
class Paginator: def __init__(self, request, current_page, all_count, per_page=10, max_page_num=13): """ 封装分页相关数据 :param current_page: 当前页码 :param all_count: 数据库中的数据总条数 :param per_page: 每个页面显示的数据条数 :param max_page_num: 最多显示的页码个数 :param num_pages: 通过总条数/每个页面显示的条数,求出总页数 """ try: current_page = int(current_page) except Exception as e: current_page = 1 if current_page < 1: current_page = 1 self.current_page = current_page self.all_count = all_count self.per_page = per_page # 计算总页数 num_pages, temp = divmod(all_count, per_page) if temp: num_pages += 1 self.num_pages = num_pages self.max_page_num = max_page_num # 11 self.page_count_half = int((self.max_page_num - 1) / 2) # 5 import copy self.url_args = copy.deepcopy(request.GET) print(self.url_args.urlencode()) """ self.num_pages=100 per_page=8 current_page =1 [0:8] current_page =2 [8:16] current_page =3 [16:24] [(current_page-1)*per_page:current_page*per_page ] """ @property def start(self): return (self.current_page - 1) * self.per_page @property def end(self): return self.current_page * self.per_page def page_html(self): # 如果总页数小于self.max_page_num(最多显示的页码个数) if self.num_pages <= self.max_page_num: page_start = 1 page_end = self.num_pages + 1 else: # 如果当前页码<=页面上最多显示11/2个页码时 if self.current_page <= self.page_count_half: page_start = 1 page_end = self.max_page_num + 1 # 如果当前页码+最多显示11/2 大于 总页数时 elif self.current_page + self.page_count_half > self.num_pages: page_start = self.num_pages - self.max_page_num + 1 page_end = self.num_pages + 1 else: page_start = self.current_page - self.page_count_half page_end = self.current_page + self.page_count_half + 1 page_html_list = [] # 首页 self.url_args['page'] = 1 first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (self.url_args.urlencode()) page_html_list.append(first_page) # 上一页 if self.current_page <= 1: prev_page = '<li class="disabled"><a href="javascript:void(0);">上一页</a></li>' else: self.url_args['page'] = self.current_page - 1 prev_page = '<li><a href="?%s">上一页</a></li>' % (self.url_args.urlencode(), ) page_html_list.append(prev_page) # 显示页码 for i in range(page_start, page_end): self.url_args['page'] = i if self.current_page == i: temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.url_args.urlencode(), i) else: temp = '<li><a href="?%s">%s</a></li>' % (self.url_args.urlencode(), i) page_html_list.append(temp) # 下一页 if self.current_page >= self.num_pages: next_page = '<li class="disabled"><a href="javascript:void(0);">下一页</a></li>' else: self.url_args['page'] = self.current_page + 1 next_page = '<li><a href="?%s">下一页</a></li>' % (self.url_args.urlencode(), ) page_html_list.append(next_page) # 尾页 self.url_args['page'] = self.num_pages last_page = '<li><a href="?%s">尾页</a></li></ul></nav>' % self.url_args.urlencode() page_html_list.append(last_page) return "".join(page_html_list)