大家好,这里是python技术宅的个人博客,欢迎大家的光临。
这次主要讲一下怎么样利用django自定义标签实现列表分页和文章分页功能,没有使用django自带的功能是为了后期网站扩展考虑,话不多说,直接开始
自定义标签可以分为三种类型:简单标签(simple_tag)、引用标签(inclusion_tag)、赋值标签(assignment_tag),在本文中会使用赋值标签,敲黑板了哈。
创建自定义标签的过程不在本文赘述,感兴趣的小伙伴可以网上搜索整理或者在本文下方留言,我会及时回复的。
自定义赋值标签类似于简单标签,使用 register.simple_tag 进行注册,但它并不会直接输出结果,而是使用 as 关键字将结果储存在指定的上下文变量中,从而降低了传输上下文的成本。
首先,先给大家贴一下我的tags文件(部分代码是网上down的,有些参数可以在理解的情况自己修改):
templatetags/
__init__.py
blog_extras.py
from django import template
register=template.Library()
@register.assignment_tag
def show_pagination(current_page,paginator,num_of_displaypages=10,num_of_backpages=4):
print(current_page)
print(paginator)
num_of_frontpages = num_of_displaypages - num_of_backpages - 3
html = ''
# 当总页数小于等于 显示页数 时,则将总页数全部显示
if paginator.num_pages <= num_of_displaypages:
for i in range(1, paginator.num_pages + 1):
html += '<li ><a href="?page=%s">%s </a></li>' % (i, i)
return (html)
# 第一种情况
elif current_page.number <= num_of_displaypages - num_of_backpages:
for i in range(1, num_of_displaypages + 1):
html += '<li ><a href="?page=%s">%s </a></li>' % (i, i)
return (html)
# 第二种情况
elif num_of_displaypages - num_of_frontpages <= current_page.number <= paginator.num_pages - num_of_backpages:
html = '''
<li><a href="?page=1">1</a></la>
<li class="disabled"><a href="?page=1">...</a></la>
'''
for i in range(current_page.number - num_of_frontpages, current_page.number + num_of_backpages + 1):
html += '<li><a href="?page=%s">%s</a></la>' % (i, i)
return (html)
# 第三种情况
else:
html = '''
<li><a href="?page=1">1</a></la>
<li class="disabled"><a href="?page=1">...</a></la>
'''
for i in range(paginator.num_pages - num_of_backpages - num_of_frontpages, paginator.num_pages + 1):
html += '<li><a href="?page=%s">%s</a></la>' % (i, i)
return (html)
标签设置好后,需要传入对应参数,我是在django栏目下首先写的,所以以django教程这个目录为例,具体代码如下:
def django_index(request):
articles=Article.objects.filter(column_id=2)
paginator = Paginator(articles,2)
cur_page = request.GET.get('page', 1) # 得到默认的当前页
current_page = paginator.page(cur_page)
return render(request,'article_django/list.html',locals())
这样的话,标签中需要的current_page还有paginator参数都有了。
接下来就是前段模板的html部分:
{% load blog_extras %}
{{ current_page.object_list }}
<div>
<ul class="pagination">
{% if current_page.has_previous %}
<li ><a href="?page={{ current_page.previous_page_number }}">上一页 <span class="sr-only"></span></a></li>
{% endif %}
{% show_pagination current_page paginator 10 3 as page_list %} <!-- 引用自定义标签,并传入参数 -->
{{ page_list|safe }} <!-- 显示 -->
{% if current_page.has_next %}
<li><a href="?page={{ current_page.next_page_number }}">下一页 <span class="sr-only"></span></a></li>
{% endif %}
</ul>
</div>
在这里,我仅贴出来分页的html代码,整体页面的内容就不展示了。
整体做完这些操作,django列表页的分页功能就做好了,贴一张图片看下效果(样式部分没有考虑,如果对bootstrap感兴趣的小伙伴可以点击进入:bootstrap教程栏目):
这里是python技术宅的个人官方博客
试错是必要的
试错第四遍
试错第四遍
试错第五遍成功
试错第五遍成功
试错第六遍成功
试错第六遍成功
第六遍终于是完全成功了
看看阅读数是否还在增加