django的分页功能类将我们常用的多种方法均封装在
Paginator
类,根据这些方法我们均可深度定制我们的分页功能。
首先来看看[Paginator
] 类的构造方法:
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
必选参数:
-
objects_list
: 必须是列表/元组或Django
所生成的QuerySet
对象,或具有count()
或__len __()
方法的其他可切片对象。 -
per_page
: 每页显示多少个数量,是一个整数
可选参数:
-
orphans
: 默认值为零,无论最后一页剩余多少条数据,都另起一页,否则将剩余的合并到上一页,举例:假如当前分页一共11
页,第11
页的只有两条数据,那么我们定义orphans=2
,则分页总数剩余10
页,最后两条数据合并到第10
页。 -
allow_empty_first_page
: 是否允许第一页为空。 如果为False
同时object_list
为空,则将引发EmptyPage
错误,默认值为True
.
Paginator的方法,2.0版后新增:
-
Paginator.get_page(number)
方法:返回当前页页码,并具有处理超出页码范围和无效页码的状况,页码不是数字返回第一页,超出返回最后一页。 -
Paginator.page(number)
方法: 返回指定页码的内容,如果给定的页码不存在,则引发InvalidPage。
属性:
-
Paginator.count
: 所有页面中的对象总数。 -
Paginator.num_pages
: 分页总数 -
Paginator.page_range
: 迭代页码,返回的是一个[1,2,3,4,...]这样的列表。
了解了上边这些之后我们既可以在模板中直接使用Page对象所提供的方法,直接使用!
Page objects对象中的方法及属性:
-
Page.has_next()
如果有下一页返回True
. -
Page.has_previous()
如果有上一页返回True
. -
Page.has_other_pages()
如果同时具有上下页返回True
. -
Page.next_page_number()
返回下一页的页码. -
Page.previous_page_number()
返回上一页的页码. -
Page.start_index()
返回当前页面的第一条数据. -
Page.end_index()
返回当前页的最后一条数据
属性
-
Page.object_list
此页上的对象列表。 -
Page.number
此页的基于 1 的页码。 -
Page.paginator
关联的 Paginator 对象。
案例详解:
# views.py from django.core.paginator import Paginator def list(request):
LIST = []
for i in range(1,102):
LIST.append(i)
paginator = Paginator(LIST, 10, orphans=2, )
pages = paginator.page_range # 生成所有页码
pages_num = paginator.num_pages # 总也数
gd_page = paginator.page(5) # 调用指定页面的内容
page = request.GET.get('page') # 当前页面
contacts = paginator.get_page(page) # 当前页并具有处理超出页码范围的状况,页码不是数字返回第一页,超出返回最后一页
return render(request, 'notes/list.html',{'contacts':contacts, 'pages':pages, 'pagenums':pages_num, 'gd_page':gd_page})
# list.html {% for contact in contacts %}
<li>{{ contact|upper }}</li>
{% endfor %} <h1>分页练习</h1> {% if contacts.has_previous %}
<li>上一页页码:{{ contacts.previous_page_number }}</li>
<a href="?page={{ contacts.previous_page_number }}">上一页</a>
{% endif %}
<li>当前页码:{{ contacts.number }}</li>
{% if contacts.has_next %}
<li>下一页页码:{{ contacts.next_page_number }}</li>
<a href="?page={{ contacts.next_page_number }}">下一页</a>
{% endif %} {{ contacts.start_index }}
{{ contacts.end_index }} <p> 所有页码:</p>
<div class="pagetions"> {% for page in pages %}
{% if page == contacts.number %}
<a class="active" href="?page={{ page }}">{{ page }}</a>
{% else %}
<a href="?page={{ page }}">{{ page }}</a>
{% endif %}
{% endfor %} </div>
总页数:{{ pagenums }}
{% for gd in gd_page %}
<li>{{ gd }}</li>
{% endfor %}
给定页码:{{ gd_page }}
创作不易,我会持续分享关于Django的相关知识,有兴趣的朋友可以关注本人微信公众号:幸福关中, 如果您觉得不错的话,打赏以下小编,小编会更有动力分享更多关于Django方面的知识,欢迎大家加小编微信交流Django知识,备注Django,小编微信:xingfuguanzhong。