小白角度,讲述Django分页器页面导航

利用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">&laquo;</span>
						      		</a>
						      	{% else %}
						      		<span aria-hidden="true">&laquo;</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">&raquo;</span>
						      </a>
						      	{% else %}
						      		<span aria-hidden="true">&raquo;</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)

先写到这里,后续再进行补充。我是个小白,这篇算是笔记,也希望让和我一样的小白更容易理解这部分内容。
欢迎大神给出建议。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值