1.Django内置分页(适用于:上一页 下一页)

1 def index(request): 2 """ 3 分页 4 :param request: 5 :return: 6 """ 7 current_page = request.GET.get('page') 8 9 user_list = models.UserInfo.objects.all() 10 paginator = Paginator(user_list,10) 11 # per_page: 每页显示条目数量 12 # count: 数据总个数 13 # num_pages:总页数 14 # page_range:总页数的索引范围,如: (1,10),(1,200) 15 # page: page对象 16 try: 17 posts = paginator.page(current_page) 18 except PageNotAnInteger as e: 19 posts = paginator.page(1) 20 except EmptyPage as e: 21 posts = paginator.page(1) 22 # has_next 是否有下一页 23 # next_page_number 下一页页码 24 # has_previous 是否有上一页 25 # previous_page_number 上一页页码 26 # object_list 分页之后的数据列表 27 # number 当前页 28 # paginator paginator对象 29 return render(request,'index.html',{'posts':posts}) 30 31 views.py

1 <h1>用户列表</h1> 2 <ul> 3 {% for row in posts.object_list %} 4 <li>{{ row.name }}</li> 5 {% endfor %} 6 </ul> 7 <div> 8 {% if posts.has_previous %} 9 <a href="/index.html?page={{ posts.previous_page_number }}">上一页</a> 10 {% endif %} 11 12 {% if posts.has_next %} 13 <a href="/index.html?page={{ posts.next_page_number }}">下一页</a> 14 {% endif %} 15 </div> 16 17 index.py
2.自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。
1、设定每页显示数据条数
2、用户输入页码(第一页、第二页...)
3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
4、在数据表中根据起始位置取值,页面上输出数据
需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]
1、设定每页显示数据条数
2、用户输入页码(第一页、第二页...)
3、设定显示多少页号
4、获取当前数据总条数
5、根据设定显示多少页号和数据总条数计算出,总页数
6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
7、在数据表中根据起始位置取值,页面上输出数据
8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

1 class PageInfo(object): 2 3 def __init__(self,current_page,all_count,per_page,base_url,show_page=11): 4 """ 5 6 :param current_page: 7 :param all_count: 数据库总行数 8 :param per_page: 每页显示行数 9 :return: 10 """ 11 try: 12 self.current_page = int(current_page) 13 except Exception as e: 14 self.current_page = 1 15 self.per_page = per_page 16 17 a,b = divmod(all_count,per_page) 18 if b: 19 a = a +1 20 self.all_pager = a 21 self.show_page = show_page 22 self.base_url = base_url 23 def start(self): 24 return (self.current_page-1) * self.per_page 25 26 def end(self): 27 return self.current_page * self.per_page 28 29 30 def pager(self): 31 # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>" 32 # return v 33 page_list = [] 34 35 half = int((self.show_page-1)/2) 36 37 # 如果数据总页数 < 11 38 if self.all_pager < self.show_page: 39 begin = 1 40 stop = self.all_pager + 1 41 # 如果数据总页数 > 11 42 else: 43 # 如果当前页 <=5,永远显示1,11 44 if self.current_page <= half: 45 begin = 1 46 stop = self.show_page + 1 47 else: 48 if self.current_page + half > self.all_pager: 49 stop = self.all_pager + 1 50 begin = self.all_pager - self.show_page + 1 51 else: 52 begin = self.current_page - half 53 stop = self.current_page + half + 1 54 55 if self.current_page <= 1: 56 prev = "<li><a href='#'>上一页</a></li>" 57 else: 58 prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,) 59 page_list.append(prev) 60 61 for i in range(begin,stop): 62 if i == self.current_page: 63 temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,) 64 else: 65 temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,) 66 page_list.append(temp) 67 68 if self.current_page >= self.all_pager: 69 nex = "<li><a href='#'>下一页</a></li>" 70 else: 71 nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,) 72 page_list.append(nex) 73 74 75 return ''.join(page_list) 76 77 utils/pager.py



1 from utils.pager import PageInfo 2 def custom(request): 3 # 表示用户当前想要访问的页码: 4 5 all_count = models.UserInfo.objects.all().count() 6 7 page_info = PageInfo(request.GET.get('page'),all_count,10,'/custom.html',11) 8 user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()] 9 10 return render(request,'custom.html',{'user_list':user_list,'page_info':page_info})
总结,分页时需要做三件事:
- 创建处理分页数据的类
- 根据分页数据获取数据
- 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]