广告位

使用django自定义标签功能实现文章分页

大家好,这里是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教程栏目):

fenyetupain.png

打赏
随机文章
广告位

添加评论


评论列表,共 10 条评论

  • python技术宅

    这里是python技术宅的个人官方博客

  • python技术宅

    试错是必要的

  • python技术宅

    试错第四遍

  • python技术宅

    试错第四遍

  • python技术宅

    试错第五遍成功

  • python技术宅

    试错第五遍成功

  • python技术宅

    试错第六遍成功

  • python技术宅

    试错第六遍成功

  • python技术宅

    第六遍终于是完全成功了

  • python技术宅

    看看阅读数是否还在增加