利用Paginator完成页面导航。
第一步,获取博客列表。(练习用的是博客网站,可根据不同内容改变代码)
blogs_all_list = Blog.objects.all()#全部的博客列表
第二步,进行分页。
page_cut = 4
paginator = Paginator(blogs_all_list, page_cut)#全部的博客列表,每x篇进行分页
实例化分页器。第一个参数是第一步获取到的博客列表,第二个参数是以x篇进行分页。这里可以直接填数字,为了后续方便改动,这里建议用变量。
第三步
page_num = request.GET.get('page', 1)#获取页面参数(GET请求)
page_of_blogs = paginator.get_page(page_num)
currentr_page_num = page_of_blogs.number #获取当前页
第四步
page_range = list(range(max(currentr_page_num - 2, 1), currentr_page_num)) + list(range(currentr_page_num, min(currentr_page_num + 2, paginator.num_pages)+1))
range是页码取值范围。max函数用来和页码1比较最大值。当前页最小是1,1-2的值和max的第二个参数相比,取最大值。
这里可以有更简洁的方法。
第五步 前端界面写出页面导航效果
前端部分可以直接用bootstrap上面的代码。
{# 上一页 #}
<li>
{% if page_of_blogs.has_previous %}
<a href="?page={{ page_of_blogs.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
{% else %}
<span aria-hidden="true">«</span>
{% endif %}
{# 指定页 #}
</li>
{% for page_num in page_range %}
{% if page_num == page_of_blogs.number %}
<li class="active"><span>{{ page_num }}</span></li>
{# {{ page_num }}是当前页数 #}
{% else %}
{% if page_num == '...' %}
<li><span>{{ page_num }}</span></li>
{% else %}
<li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
{# 下一页 #}
<li>
{% if page_of_blogs.has_next %}
<a href="?page={{ page_of_blogs.next_page_number }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
第六步 添加首页和尾页
{# 首页 #}
<li>
<a href="?page=1" aria-label="首页">
<span aria-hidden="true">首页</span>
</a>
首页代码可以用下一页的代码直接更改,去掉判断语句,直接链接到第一页。page=1就可以。
{# 尾页 #}
<li>
<a href="?page={{ last_page }}" aria-label="尾页">
<span aria-hidden="true">尾页</span>
</a>
</ul>
尾页先用首页的代码改好,链接到最后一页。
last_page这个变量,在views.py中提前写好。
last_page = paginator.num_pages
blogs_all_list.count()
全部的列表的.count()方法,得出总篇数。
总篇数整除// page_cut,也就是按x篇分页的x。这里因为整除是向下取值的,9//2 的结果4。
如果有35篇文章,以4篇为一页分页,35//4的结果是8,只能分到8页,剩下的3篇没有地方放了。所以这里我加了 + page_cut - 1,之后再整除。
第七步 补齐页码
写完首尾页,会发现分页的时候,最开始的几页和最后的几页会出现页码不齐的效果。如图:
#补齐页码
if last_page > 4:
if current_page < 2:
page_range.extend([current_page + 3, current_page + 4])
elif current_page == 2:
page_range.append(current_page + 3)
elif last_page - current_page == 0:
page_range.insert(0, last_page - 3)
page_range.insert(0, last_page - 4)
elif last_page - current_page == 1:
page_range.insert(0, last_page - 3)
elif last_page == 4:
if current_page < 2:
page_range.append(current_page + 3)
elif last_page - current_page == 0:
page_range.insert(0, last_page - 3)
先写到这里,后续再进行补充。我是个小白,这篇算是笔记,也希望让和我一样的小白更容易理解这部分内容。
欢迎大神给出建议。