python的Web框架,html分页

使用简单的算法得出页码数,然后在html中获取即可。仅供参考。

 

views的写法

 1 def crm_stu(request):
 2     section = '教师后台管理页'
 3     search = request.GET.get('search', '').strip()  #搜索的值
 4     if search:
 5         # 如果是数字,则返回qq或者phone的查询结果
 6         if search.isdigit():
 7             sts = Students.objects.filter(Q(qq=search) | Q(phone=search), is_deleted=False).order_by('-e_time')
 8         # 如果不是数字,则返回姓名的查询结果。
 9         else:
10             sts = Students.objects.filter(name__contains=search, is_deleted=False).order_by('-e_time')
11     
12     # 如果搜索的值不存在,则返回没有删除的值。
13     else:
14         sts = Students.objects.filter(is_deleted=False).order_by('-e_time')
15 
16 
17     把需要的数据计算出来,然后传给tags标签
18     # 当前页
19     page = request.GET.get('page', 1)
20     page = int(page)
21     # 每页显示的数据条数
22     per_page = request.GET.get('per_page', 10)
23     per_page = int(per_page)
24     # 总学生数
25     total_count = sts.count()
26     # 总页数
27     total_page = math.ceil(total_count/per_page)
28 
29     # 获取数据的范围。
30     sts = sts[(page-1)*per_page:page*per_page]
31     
32     #把需要的参数和值传送给html
33     return render(request, 'teacher/crm-stu.html', context={
34         'section': section,
35         'sts': sts,
36         'search': search,
37         'page': page,
38         'per_page': per_page,
39         'total_page':total_page,
40     })

标签tags的方法定义

 1 # 注册并把配置的网页放进来,并把context传给网页
 2 @register.inclusion_tag('inclu_tags/pagination.html',takes_context=True)
 3 
 4 def pagination(context):
 5     
 6     # 除当前页外,每两边的页码数
 7     num = 2
 8     page = context['page']
 9     per_page = context['per_page']
10     total_page = context['total_page']
11 
12     page_list = []
13     # 生成左边的页码以及当前页码
14     if page - num <= 0:  #如果当前页面减去num的数量小于等于0,则左边页码是展示不全的,不够num的数量
15         for i in range(page):
16             page_list.append(i+1)
17     else:
18         for i in range(page-num,page+1):
19             page_list.append(i)
20             
21     # 生成右边的页码
22     if page + num >= total_page: #如果当前的页码加上num的数量大于总页数,则右边的页码超出了总页数,就需要页码只到总页数为止
23         for i in range(page+1, total_page+1):
24             page_list.append(i)
25     else:
26         for i in range(page+1, page+num+1):
27             page_list.append(i)
28 
29     return {
30         'page_list': page_list,
31         'context': context,
32     }

num代表页面两边的页面数量。每边的页码只有2个,则num就是2。 

html中的用法:css样式请忽略

 1 <nav aria-label="Page navigation">
 2   <ul class="pagination" style="margin: 0">
 3   
 4     <!--如果当前页码为1,则显示css样式,不能点击-->
 5     <li {% if context.page == 1 %}class="disabled" {% endif %}>
 6         如果当前页码为大于1,则加上href标签,可以有点击上一页的标签,且上一页的标签需要渲染出来。是当前网址+参数(搜索内容,当前页码-1,每页展示的数据条数)
 7       <a {% if context.page > 1  %}href="{{ request.path }}?search={{ context.search }}&page={{ context.page|add:'-1' }}
 8       &per_page={{ context.per_page }}"{% endif %} aria-label="Next">
 9         <span aria-hidden="true">&laquo;</span>
10       </a>
11       
12       
13     </li>
14   {% for page in page_list %}
15     <li {% if context.page == page %}class="active" {% endif %}><a href="{{ request.path }}?search={{ context.search }}
16     &page={{ page }}&per_page={{ context.per_page }}">{{ page }}</a></li>
17   {% endfor %}
18     <li {% if context.page == context.total_page %}class="disabled" {% endif %}>
19       <a {% if context.page < context.total_page %}href="{{ request.path }}?search={{ context.search }}&page=
20 {{ context.page|add:'1' }}&per_page={{ context.per_page }}"{% endif %} aria-label="Next">
21         <span aria-hidden="true">&raquo;</span>
22       </a>
23     </li>
24   <li><a href="{{ request.path }}?page=1&per_page={{ context.per_page }}">回到首页</a></li>
25   </ul>
26 </nav>

Django内置分页功能

# 接受两个参数
from django.core.paginator import Paginator
from teacher.models import Students
>>>p = Paginator(Students.objects.all().ordet_by('-c_time'), 3)

# 总数据量
>>> p.count
15

# 总页数
>>> p.nun_pages
5

# 页面范围
>>> p.page_range
range(1,6)

# 返回第一页的数据
>>> page1 = p.page(1)

# 获取的是一个可迭代的set字段
>>> page1.object_list
 <QuerySet [<Students: 哈哈哈-23>, <Students: 哈哈-15>, <Students: aaaasdds-16>]>

# 是否有上一页
>>> page1.has_previous()
False

# 是否有下一页
>>> page.has_next()
True

# 下一页的页码
>>> page1.next_page_number()
2

# 获取当前页的数据
>>> s = p.get_page(1)

# 当前页码
>>>page1.nunber
1
原文地址:https://www.cnblogs.com/hua888/p/10524172.html