显示的数据很多时,可以将数据分成若干页显示
分页的一些方法:
#分页
导入分页相关的包
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
def page_test(request):
course = ['c++', 'python', 'java', 'php', 'iOS', 'C', 'C#', 'GO', 'dart']
p = Paginator(course, 2)#实例化分页对象, 每页显示2个元素
print(p.count)#对象总数量
print(p.num_pages)#总页数
print(p.page_range)#页码范围
print(p.per_page)#每一页显示几个对象
page1 = p.page(1)#第一页
page2 = p.page(2)#第二页
print(page1.object_list)#显示元素
print(page2.object_list)#显示元素
print(page1.number)#获取当前页码
print(page2.number)#获取当前页码
#方法
print(page1.has_next())#查看当前页有没有下一页
print(page1.has_previous())#查看当前页有么有上一页
print(page1.has_other_pages())#查看当前页是否有上一页或下一页
print(page1.next_page_number())#获取下一页页码
print(page2.previous_page_number())#获取上一页页码
print(page1.start_index())#当前页第一个元素索引
print(page2.end_index())#当前页最后一个元素索引
return HttpResponse('分页')
分页例子:
views.py中
def blog_list(request):
blog = blogModel.objects.all()#查到的数据
p = Paginator(blog, 3)#分页对象
currentPage = request.GET.get('page')#当前第几页
# 检验错误
try:
pages = p.page(currentPage)
except PageNotAnInteger:
pages = p.page(1)
except EmptyPage:
pages = p.page(p.num_pages)
将数据传给模版
return render(request, 'blog/demo_list.html', context={
'pages':pages
})
demo_list.html中
{% extends 'blog/demo_base.html' %}
{% block title %}
数据列表
{% endblock %}
{% block bodyblock %}
<h1 style="margin-left: 100px">文章列表</h1>
<table width="400px">
<thead style="font-size:20px">
<tr>
<th>标题</th>
<th>操作</th>
</tr>
</thead>
<tbody>
循环遍历传过来的数据,并显示
{% for blog in pages %}
<tr>
<th><a href="{% url 'blog_detail' blog.id %}">{{ blog.title }}</a></th>
<th><a href="{% url 'cls_update' blog.id %}">编辑</a> | <a href="{% url 'blog_delete' blog.id %}">删除 </a></th>
</tr>
{% endfor %}
<tr>
{# 上一页#}
判断当前页,是否有上一页,
{% if pages.has_previous %}
拼接路由,后面添加page参数
<th><a href="{% url 'blog_list' %}?page={{ pages.previous_page_number }}">上一页</a></th>
{% endif %}
{# 当前页#}
循环分页对象的页码范围
{% for index in pages.paginator.page_range %}
判断循环的页码是否是当前页,如果是,就改变显示
{% if index == pages.number %}
<th><a href="{% url 'blog_list' %}?page={{ index }}" style="color: red">{{ index }}</a></th>
{% else %}
如果是其他的页码,就不变
<th><a href="{% url 'blog_list' %}?page={{ index }}">{{ index }}</a></th>
{% endif %}
{% endfor %}
{# 下一页#}
判断当前页是否有下一页
{% if pages.has_next %}
拼接路由,添加page参数
<th><a href="{% url 'blog_list' %}?page={{ pages.next_page_number }}">下一页</a></th>
{% endif %}
</tr>
</tbody>
</table>
{% endblock %}