python - Django用模板标签templatetags分页文章html传入参数后context无返回或者是参数是没有传入模板函数?

 黑_猫__警_长 发布于 2022-10-30 14:10

我按照这篇https://segmentfault.com/a/11...的方法去实现一个分页功能。原本用django系统的painator是可以实现分页的,只是把全部页码都输出到html里,文章多了十分不好。于是网上找到这篇文章,使用的是templatetags模板标签去实现分页,可以参考django官方文档https://docs.djangoproject.co...。我用了里面的simple_tag(),运行之后没有报错,但是文章内容分页导航什么都不显示了。后来我尝试了在下面第二段代码的def paginate(context, object_list, page_count)里估计把一些代码写错,运行之后居然也没有报错,我就怀疑在我的html里{% paginate post_list 3 %}是不是没有传入参数失效,还是paginate方法没有运行啊?下面的context标签上下文{{ article_list }}{{ article.title}}以及后面的也都是无效的,html没有显示任何东西。折腾了几天了,求大神解救!告诉我哪里出错了,可以的话贴一下代码,感激不尽!

1.这是我的app应用,放置templatetags目录的地方

__init__.py
models.py
templatetags/
    __init__.py
    paginate_tag.py
views.py
model.py

2.下面的是paginate_tag.py的内容,实现分页和context

from django import template
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage

register = template.Library()

@register.simple_tag(takes_context=True)
def paginate(context, object_list, page_count):
    left = 3
    right = 3

    paginator = Paginator(object_list, page_count)
    page = context['request'].GET.get('page')

    try:
        object_list = paginator.page(page)
        context['current_page'] = int(page)
        pages = get_left(context['current_page'], left, paginator.num_pages) + get_right(context['current_page'], right,
                                                                                         paginator.num_pages)
    except PageNotAnInteger:
        object_list = paginator.page(1)
        context['current_page'] = 1
        pages = get_right(context['current_page'], right, paginator.num_pages)
    except EmptyPage:
        object_list = paginator.page(paginator.num_pages)
        context['current_page'] = paginator.num_pages
        pages = get_left(context['current_page'], left, paginator.num_pages)

    context['article_list'] = object_list
    context['pages'] = pages
    context['last_page'] = paginator.num_pages
    context['first_page'] = 1
    try:
        context['pages_first'] = pages[0]
        context['pages_last'] = pages[-1] + 1
    except IndexError:
        context['pages_first'] = 1
        context['pages_last'] = 2

    return ''  # 必须加这个,否则首页会显示个None


def get_left(current_page, left, num_pages):
    if current_page == 1:
        return []
    elif current_page == num_pages:
        l = [i - 1 for i in range(current_page, current_page - left, -1) if i - 1 > 1]
        l.sort()
        return l
    l = [i for i in range(current_page, current_page - left, -1) if i > 1]
    l.sort()
    return l


def get_right(current_page, right, num_pages):
    if current_page == num_pages:
        return []
    return [i + 1 for i in range(current_page, current_page + right - 1) if i < num_pages - 1]
    

3.这个是实现分页这部分的html代码

templates/blog/pagination.html


  1. 这里是我的视图函数views.py

 from django.shortcuts import render
    from django.http import HttpResponse
    from article.models import Article
    
    def home(request)
        post_list = Article.objects.all()
        return render(request, 'home.html', {'post_list': post_list})
    ...
  1. 最后是我要实现分页的页面
    home.html

{% load paginate_tags %}
{% paginate post_list 3 %}   # context是默认传入的,我把post_list和文章数传入,我要实现每页3篇文章,所以传入3
{% for article in article_list %}
    

{{ article.title }}

{{ article.content }}

... ... ...
{% include 'pagination.html' %} ....
2 个回答
  • 变量名不统一。

    {% include %}标签继承的是当前home.html的变量,而home.html的变量是views.home传递的{'post_list': post_list},也就是变量名为'post_list'指向对象post_list,而你在模板里使用的都是'article_list',这个变量名没有指向任何对象。

    2022-10-31 21:17 回答
  • 感谢楼上两位热心的回答,特别是@tcztzy ,写了个项目发邮件给我了,非常感谢。真是打扰了,@追梦人物 ,不是代码的问题,是我犯了个低级错误,原因是我用home.html是{% extends base.html %},然后home.html的html内容用{% block content %}包起来了,关键是我把{% load paginate %}放在home.html的第二行,处于我的{% block content %}外面了,导致html先加载到浏览器后,才处理分页,所以页面上啥也没有。所以我把{% load paginate %}放到了{% block content %}里面就成功显示了。

    2022-10-31 21:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有