![d2897f7a121f64910d9cb339285642e2.png](https://i-blog.csdnimg.cn/blog_migrate/a1c628e0d658ffc6bec92d48cf88e72a.jpeg)
![916f1525df1c702999e58ae6a5ed22d7.gif](https://i-blog.csdnimg.cn/blog_migrate/41a8516467a38b1617c34a5ace94a084.gif)
哈喽,大家好呀,我是滑稽君。本期我们想要为博客添加底部翻页功能,文章内上下篇翻页功能,日期归类功能。这样我们就不需要在地址栏,传入参数来翻页啦。
![9a82ce3daef425e57fbaeb7f4490a779.gif](https://i-blog.csdnimg.cn/blog_migrate/6e24f9d8f796719bbb0a99148b07300d.gif)
视频讲解:
如下:
日期分类:
上下篇:
当博客太多时,使其全部在一个网页上显示是不合理的,而且一次加载大量的博客,会使我们的处理速度变慢。因此我们把7篇博客分为一页,并在底部加上翻页的按钮(其实就是一些超链接)。我们希望页码太长时,进行折叠,页数太靠后或是靠前时,我们显示首尾页的按钮,方便我们跳转。在文章的内部我们还添加了上下篇的转跳。
日期分类需要我们先对博客有一个时间的排序。之前在models.py中,我们对bolgs进行了时间倒叙排列。
ordering = ['-created_time']
我们在views.py中,我们写了如何处理上下篇翻页的问题。详见注释。
def blog_detail(request, blog_pk): context = {} blog = get_object_or_404(Blog, pk=blog_pk) #filter后的内容,返回比当前时间大于的创建时间的最后一个。这样我们可以得到上一篇博客 context['previous_blog'] = Blog.objects.filter(created_time__gt=blog.created_time).last() context['next_blog'] = Blog.objects.filter(created_time__lt=blog.created_time).first() context['blog'] = blog return render_to_response('blog/blog_detail.html', context)
那么按钮是如何添加的呢?在bolg_list.html中:
<ul class="pagination"> {# 上一页 #} <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> {% 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> ul>
这里是使用了bootstrap框架来完成。如上样式,大家可以查看中文文档,来挑选自己需要的内容。关键是如何实现我们刚才说的那种页码效果。
views.py:
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)) # 获取页码的数量 paginator.num_pages # 加上省略号 if page_range[0] - 1 >= 2: page_range.insert(0, '...') if paginator.num_pages - page_range[-1] >= 2: page_range.append('...') # 加上首位页 if page_range[0] != 1: page_range.insert(0, 1) if page_range[-1] != paginator.num_pages: page_range.append(paginator.num_pages)
我们使用max()和range()组合来完成。我们通过if来判断,是否需要添加省略号和首尾页的功能。若它们返回的页码和1相差超过3,那我们就添加一个省略号,并把首页添加到第一的位置。
仅展示部分源码,更细节的内容我们放在视频中为大家演示,全部源码放百度云啦~
https://pan.baidu.com/s/1tUJ3x9l_Dq1EvmTtMT4GOQ公众号内发送django获取提取码。https://space.bilibili.com/252028233
![ee6a8f6305a2dd5a22f6749c9d68cba4.gif](https://i-blog.csdnimg.cn/blog_migrate/0320e252af794e01c15962be77938ac7.gif)
页码处理的部分大家可以代数算一下,我也会在视频中为大家简单的说一下。