0. 框架自带
Django自带的分页功能:
1 2 3 4 5 6 7 8 9 10 11 12
| from django.core.paginator import Paginator, Page, PageNotAnInteger, EmptyPage
def index(request, a): current_page = request.GET.get('page') user_list = models.UserInfo.objects.all() paginator = Paginator(user_list, 2) try: posts = paginator.page(current_page) except PageNotAnInteger or EmptyPage as e: posts = paginator.page(1)
return render(request, 'index.html', {'posts':posts})
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <h1> 用户列表 </h1> <ul> {% for row in posts.object_list %} <li> {{ row.username }} </li> {% endfor %} </ul> <div> {% if posts.has_previous %} <a href="/index/?page={{ posts.previous_page_number }}">上一页</a> {% endif %} {% if posts.has_next %} <a href="/index/?page={{ posts.next_page_number }}">下一页</a> {% endif %} </div>
|
1. 自开发
但由于只有Django框架有分页函数,且其自身的函数不好用(比如不支持显示左右部分分页),基于普适性规则,我们自己开发了分页函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import math class PageInfo():
def __init__(self, current_page, item_num, per_page, base_url, show_page=5): try : self.current_page = int(current_page) except Exception as e: self.current_page = 1 self.page_num = math.ceil(item_num/per_page) self.per_page = per_page self.base_url = base_url self.show_page = show_page print("pagenum:",self.page_num)
def begin_item(self): return (self.current_page-1) * self.per_page
def end_item(self): return self.current_page * self.per_page
def show(self): page_list = [] half = int((self.show_page-1)/2)
if self.page_num < self.show_page: begin_page = 1 end_page = self.page_num + 1 elif self.current_page <= half: begin_page = 1 end_page = self.show_page + 1 elif self.current_page >= self.page_num - half: begin_page = self.page_num - self.show_page + 1 end_page = self.page_num + 1 else: begin_page = self.current_page - half end_page = self.current_page + half + 1
if self.current_page <= 1: prev_page = "<li><a href='#'>上一页</a></li>" else: prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page-1) page_list.append(prev_page)
for page in range(begin_page, end_page): if page == self.current_page: tag = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url, page, page) else: tag = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, page, page) page_list.append(tag) if self.current_page >= self.page_num: next_page = "<li><a href='#'>下一页</a></li>" else: next_page = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page+1) page_list.append(next_page)
return page_list
|
调用:
1 2 3 4 5 6 7 8
| current_page = int(request.GET.get('page'))
item_num = models.UserInfo.objects.all().count() pageinfo = PageInfo(current_page, item_num, per_page=10, '/manageapp1/custom.html/') user_list = models.UserInfo.objects.all()[pageinfo.begin_item() : pageinfo.end_item()] page_list = pageinfo.show()
return render(request, 'custom.html', {'user_list':user_list, 'page_list':page_list})
|
custom.html
:(需要引入Bootstrap)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <head lang="en"> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> </head> <body> <h1> 用户列表 </h1> <ul> {% for row in user_list %} <li> {{ row.username }} </li> {% endfor %} </ul> <nav aria-label="Page navigation"> <ul class="pagination"> {% for page in page_list %} {{page|safe}} {% endfor %} </ul> </nav> </body>
|
效果:

1 2 3 4
| from django.utils.safestring import mark_safe
temp = "<a href='...'>...</a>" temp = mark_safe(temp)
|