分页

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
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
index.html

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
utils/pager.py
models.py
custom.html
 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})
views

总结,分页时需要做三件事:

  • 创建处理分页数据的类
  • 根据分页数据获取数据
  • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]

 

 

posted @ 2018-02-03 15:12  南城思念,北城等待  阅读(180)  评论(0编辑  收藏  举报