Django框架基础之分页
Posted 柳姑娘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架基础之分页相关的知识,希望对你有一定的参考价值。
Django内置分页:
只适用于只有上一页和下一样的页面
1 def index(request):
2
3 current_page=request.GET.get(‘page‘)
4 user_list=models.UserInfo.objects.all()
5 paginator=Paginator(user_list,10)
6 # per_page: 每页显示条目数量
7 # count: 数据总个数
8 # num_pages:总页数
9 # page_range:总页数的索引范围,如: (1,10),(1,200)
10 # page: page对象
11 try:
12 posts=paginator.page(current_page)
13 # has_next 是否有下一页
14 # next_page_number 下一页页码
15 # has_previous 是否有上一页
16 # previous_page_number 上一页页码
17 # object_list 分页之后的数据列表
18 # number 当前页
19 # paginator paginator对象
20 except PageNotAnInteger as e:
21 posts=paginator.page(1)
22 except EmptyPage as e:
23 posts=paginator.page(1)
24 return render(request,‘index.html‘,{‘posts‘:posts})
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Title</title>
6 </head>
7 <body>
8 <h1>用户列表</h1>
9 <ul>
10 {% for row in posts.object_list %}
11 <li>{{ row.name }}</li>
12 {% endfor %}
13 </ul>
14 <div>
15 {% if posts.has_previous %}
16 <a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
17 {% endif %}
18 {% if posts.has_next %}
19 <a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
20 {% endif %}
21 </div>
22 </body>
23 </html>
自定义分页:(其内部应用的就是mysql中的limit方法)
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。
1、设定每页显示数据条数
2、用户输入页码(第一页、第二页...)
3、设定显示多少页号
4、获取当前数据总条数
5、根据设定显示多少页号和数据总条数计算出,总页数
6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
7、在数据表中根据起始位置取值,页面上输出数据
8、输出分页html,如:[上一页][1][2][3][4][5][下一页]
1 class PageInfo(object): 2 def __init__(self,current_page,all_count,per_page,base_url,show_page=11): 3 ‘‘‘ 4 5 :param current_page: 当前页 6 :param all_count: 全部数据行数 7 :param per_page: 每页显示的数据行数 8 :param base_url: 要跳转的url 9 :param show_page: 每页显示的页数 10 ‘‘‘ 11 try: 12 13 self.current_page = int(current_page) 14 except Exception as e: 15 self.current_page = 1 16 17 self.per_page=per_page 18 19 a, b = divmod(all_count,per_page) 20 if b: 21 a = a + 1 22 self.all_pager = a 23 self.show_page = show_page 24 self.base_url=base_url 25 def start(self): #当前页的数据第一行的索引 26 return (self.current_page-1)*self.per_page 27 28 def end(self): #当前页的数据最后一行的索引 29 return self.current_page*self.per_page 30 31 def pager(self): 32 # v = "<a href=‘/custom.html?page=1‘>1</a><a href=‘/custom.html?page=2‘>2</a>" 33 # return v 34 page_list=[] 35 36 half =int((self.show_page-1)/2) 37 38 #如果数据总页数《 要显示的页数 39 if self.all_pager < self.show_page: 40 begin=1 41 stop=self.all_pager 42 else: 43 #如果数据总页数大于要显示的页数 并且当前页数小于等于5(只显示1-11) 44 if self.current_page <= half: 45 begin=1 46 stop=self.show_page 47 else: 48 # 如果数据总页数大于要显示的页数 并且当前页数+5 大于最大页数(只显示最大页-11,最大页) 49 if self.current_page + half > self.all_pager: 50 stop=self.all_pager +1 51 begin=self.all_pager - self.show_page +1 52 else: 53 # 正常情况下,显示当前页数的前后5页 54 begin = self.current_page - half 55 stop = self.current_page + half + 1 56 57 if self.current_page <= 1: 58 prev = "<li><a >上一页</a><li>" 59 else: 60 prev="<li><a href=‘%s?page=%s‘>上一页</a><li>"%(self.base_url,self.current_page-1,) 61 page_list.append(prev) 62 63 for i in range(begin,stop): 64 if i == self.current_page: 65 temp="<li class=‘active‘><a href=‘%s?page=%s‘>%s</a><li>"%(self.base_url,i,i) 66 else: 67 temp = "<li><a href=‘%s?page=%s‘>%s</a><li>" % (self.base_url,i, i) 68 page_list.append(temp) 69 70 if self.current_page >= self.all_pager: 71 nex="<li><a href=‘%s?page=%s‘>下一页</a><li>"%(self.base_url,self.current_page,) 72 else: 73 nex="<li><a href=‘%s?page=%s‘>下一页</a><li>"%(self.base_url,self.current_page+1,) 74 page_list.append(nex) 75 76 return ‘‘.join(page_list)
1 def custom(request): 2 3 all_count=models.UserInfo.objects.all().count() 4 5 page_info=PageInfo(request.GET.get(‘page‘),all_count,10,‘/custom.html‘) 6 custom_list=models.UserInfo.objects.all()[page_info.start():page_info.end()] 7 return render(request,‘custom.html‘,{‘custom_list‘:custom_list,‘page_info‘:page_info})
以上是关于Django框架基础之分页的主要内容,如果未能解决你的问题,请参考以下文章