先上最终实现结果:
一:views.py中的代码
from django.core.paginator import Paginator
def index(request, page_num):
if len(page_num) == 0:
page_num = 1
# 1. 把需要分页的数据全部查询出来
all_data = PassPicture.objects.all()
# 2. 利用查询出来的数据,创建一个分页器对象
# 参数1:要分页的数据;参数2:设置每页要展示的数据个数;参数3:如果最后一页不到5个数据,是否将最后一页的数据合并到上一页进行展示;默认是False,不合并;
paginator = Paginator(all_data, 10)
# page对象有三个属性:
# a> page.number: 表示当前查询的页码;
# b> page.object_list: 表示当前页要展示的数据;
# c> page.paginator: 它就是上面创建的Paginator(user_list, 5)这个对象,无论是哪一页,这个paginator对象始终跟着Page对象;
# 3. 调用paginator分页器对象的page方法,返回number页的Page类实例对象
page = paginator.page(page_num)
return render(request, "boloni/传图.html", {"page": page})
二:urls.py中的代码:
urlpatterns = [
re_path(r'^index/(\d*)$', views.index, name="index"), # 首页
]
三:html中的代码
{# 表格区域 #}
<table class="table table-bordered table-hover">
{% for data in page.object_list %}
<tr>
<td>{{ data.id }}</td>
<td>{{ data.name }}</td>
<td>{{ data.customer_id|default_if_none:"" }}</td>
</tr>
{% endfor %}
</table>
{# 页面底部 #}
<ul class="pager">
<li><a href="/index/"><span class="glyphicon glyphicon-step-backward"></span></a></li>
{% if page.has_previous %}
<li><a href="/index/{{ page.previous_page_number }}"><span class="glyphicon glyphicon-triangle-left"></span></a></li>
{% else %}
<li><a href=""><span class="glyphicon glyphicon-triangle-left"></span></a></li>
{% endif %}
<li> 第 <input type="text" value="{{ page.number }}" class="page_num"> 页 </li>
{% if page.has_next %}
<li><a href="/index/{{ page.next_page_number }}"><span class="glyphicon glyphicon-triangle-right"></span></a></li>
{% else %}
<li><a href=""><span class="glyphicon glyphicon-triangle-right"></span></a></li>
{% endif %}
<li><a href="/index/{{ page.paginator.num_pages }}"><span class="glyphicon glyphicon-step-forward"></span></a></li>
<li> 共{{ all_rows }}条,共{{ page.paginator.num_pages }}页</li>
</ul>
四、分页常用的属性和方法
五:进行页码的控制,页面上最多显示指定个数的页码,此案例最多显示5个页码
views.py中的代码
# todo: 进行页码的控制,页面上最多显示5个页码
# 1. 当总页数小于5页时,显示所有页码
# 2. 如果当前页是前3页,显示1-5页
# 3. 如果当前页是后3页,显示最后5页
# 4. 其他情况,显示当前页的前2页,当前页,当前页的后2页
# pages就是构建的页码列表
num_pages = paginator.num_pages
if num_pages < 5:
pages = range(1, num_pages + 1)
elif page <= 3:
pages = range(1, 6)
elif num_pages - page <= 2:
pages = range(num_pages - 4, num_pages + 1)
else:
pages = range(page - 2, page + 3)
构建页码列表总结:其实实现页码控制就是自己构建一个页码列表,最终将页码列表传递给模板,
从而代替原始使用的页码列表:page.paginator.page_range
六:分页的通过控制写法
#分页
paginator = Paginator(orders, 1)
# 处理页码
try:
page = int(page)
except Exception as err:
page = 1
if page > paginator.num_pages:
# page页数不存在
page = 1
# 获取第page页的Page实例对象
order_page = paginator.page(page)
# todo: 进行页码的控制,页面上最多显示5个页码
# 1. 当总页数小于5页时,显示所有页码
# 2. 如果当前页是前3页,显示1-5页
# 3. 如果当前页是后3页,显示最后5页
# 4. 其他情况,显示当前页的前2页,当前页,当前页的后2页
num_pages = paginator.num_pages
if num_pages < 5:
pages = range(1, num_pages + 1)
elif page <= 3:
pages = range(1, 6)
elif num_pages - page <= 2:
pages = range(num_pages - 4, num_pages + 1)
else:
pages = range(page - 2, page + 3)
最终使用的两个变量就是:order_page页码对象,第二个就是:pages页码列表