python shell模式下导入django下的Paginator模块
In [1]: from django.core.paginator import Paginator
python shell模式下导入需要展示的页面类
In [2]: from students.models import Student
python shell模式下拿到数据并进行展示
#拿到数据以倒叙进行展示,每页展示3条
In [3]: p = Paginator(Student.objects.all().order_by('c_time'),3)
在python shell模式下模式下查看
In [4]: p.count #查看总数
Out[5]: 9
In [6]: p.num_pages #查看总数据可以分为几页
Out[7]: 3
In [8]: p.page_range #范围
Out[9]: range(1, 4)
In [10]: pag1.object_list #查看第一页数据
Out[11]: <QuerySet [<Student: Aaron-23>, <Student: Bleak-23>, <Student: Rose-29>]>
In [15]: pag1.has_previous() #验证第一页是否有上一页
Out[15]: False
In [16]: pag1.has_next() #验证第一页是否有下一页
Out[16]: True
编写视图
def student_list(request):
#分页
#数据总量
total_num = sts.count()
#每页的数据条数
per_page = request.GET.get('per_page',10) #10为默认值,每页数据条数
#当前页码
page = request.GET.get('page',1)
paginator = Paginator(sts,per_page)#每页显示的人数
sts = paginator.get_page(page) #显示是哪一页
total_page = paginator.num_pages #总页面
return render(request,'students/student_list.html',context={
"per_page" : per_page,
"total_page" : total_page,
"page" : page,
})
编写页面
<div class="btn-group">
<nav aria-label="Page navigation">
{% pagination_html %}
</nav>
</div>
<!-- Single button -->
<div class="btn-group" style="margin-top: -5px">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ per_page }}条/页 <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="{{ request.path }}?per_page=3">3条/页</a></li>
<li><a href="{{ request.path }}?per_page=5#">5条/页</a></li>
<li><a href="{{ request.path }}?per_page=10">10条/页</a></li>
</ul>
</div>
注册
from django import template
register = template.Library()
@register.inclusion_tag('students/pagination.html',takes_context=True)
def pagination_html(context):
total_page = context['total_page']#总页码数
page = int(context['page']) #当前页
num = 1 #左右各显示几页
page_list = []
"""
第一部分:当前页+左边页码范围
1、当前页左边不够显示,范围就是1-当前页
2、当前页左边可以显示,范围就是page-num到当前页
第二部分:右边页码范围
1、当前页右边不够显示,范围就是当前页+1-->total_page
2、当前页右边可以显示,范围就是当前页+1-->page+num
"""
#第一部分:
if page - num <= 0:
for i in range(1,page+1):
page_list.append(i)
else:
for i in range(page-num,page+1):
page_list.append(i)
#第二部分:
if page + num >= total_page:
for i in range(page+1,total_page+1):
page_list.append(i)
else:
for i in range(page+1,page+num+1):
page_list.append(i)
return {"page_list" : page_list,
"page" : page,
"per_page" : context['per_page'],
"total_page" : total_page,
}
自定义模板
<ul class="pagination">
<li {% if page == 1 %}class="disabled" {% endif %}>
<a href="{% if page > 1 %}{{ request.path }}?page={{ page|add:'-1' }}&per_page={{ per_page }}{% endif %}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% for page_num in page_list %}
<li {%if page_num == page %}class="active" {% endif %}><a href="{{ request.path }}?page={{ page_num }}&per_page={{ per_page }}">{{ page_num }}</a></li>
{% endfor %}
<li {% if page == total_page %}class="disabled" {% endif %}>
<a href="{% if page < total_page %}{{ request.path }}?page={{ page|add:'1' }}&per_page={{ per_page }}{% endif %}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
效果展示