为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2019-02-24 09:19:08
我按照这篇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 <div id="pagenavi" class="noselect"> {% if article_list.has_previous %} # 判断是否还有上一页,有的话要显示一个上一页按钮 <a class="previous-page" href="?page={{ article_list.previous_page_number }}"> <span class="icon-previous"></span>上一页 </a> {% endif %} # 页码号为1永远显示 {% if first_page == current_page %} # 当前页就是第一页 <span class="first-page current">1</span> {% else %} # 否则的话,第一页是可以点击的,点击后通过?page=1的形式把页码号传递给视图函数 <a href="?page=1" class="first-page">1</a> {% endif %} {% if pages_first > 2 %} # 2以前的页码号要被显示成省略号了 <span>...</span> {% endif %} {% for page in pages %} # 通过for循环把pages中的值显示出来 {% if page == current_page %} # 是否当前页,按钮会显示不同的样式 <span class="current">{{ page }}</span> {% else %} <a href="?page={{ page }}">{{ page }}</a> {% endif %} {% endfor %} # pages最后一个值+1的值小于最大页码号,说明有页码号需要被省略号替换 {% if pages_last < last_page %} <span>...</span> {% endif %} # 永远显示最后一页的页码号,如果只有一页则前面已经显示了1就不用再显示了 {% if last_page != 1 %} {% if last_page == current_page %} <span class="current">{{ last_page }}</span> {% else %} <a href="?page={{ last_page }}">{{ last_page }}</a> {% endif %} {% endif %} # 还有下一页,则显示一个下一页按钮 {% if article_list.has_next %} <a class="next-page" href="?page={{ article_list.next_page_number }}"> 下一页<span class="icon-next"></span> </a> {% endif %} </div> 这里是我的视图函数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}) ... 最后是我要实现分页的页面home.html {% load paginate_tags %} {% paginate post_list 3 %} # context是默认传入的,我把post_list和文章数传入,我要实现每页3篇文章,所以传入3 {% for article in article_list %} <section class="post"> <h1>{{ article.title }}</h1> <p>{{ article.content }} </p> ... ... ... </section> {% include 'pagination.html' %} ....
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-03-04
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

变量名不统一。

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

查看完整回答
反对 回复 2019-03-04
  • 2 回答
  • 0 关注
  • 972 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信