我按照这篇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
<p 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 %}
</p>
这里是我的视图函数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' %}
....
Merci aux deux personnes ci-dessus pour leurs réponses enthousiastes, en particulier @tcztzy, qui a écrit un projet et me l'a envoyé par e-mail. Merci beaucoup. Je suis vraiment désolé, @梦 Chaser, ce n'est pas un problème de code, c'est une simple erreur que j'ai commise. La raison est que j'ai utilisé
{% extends base.html %}
pour home.html, puis j'ai enveloppé le contenu html de home.html avec . La clé est que j'ai mis{% block content %}
dans la deuxième ligne de home.html, en dehors de mon{% load paginate %}
, ce qui a provoqué le chargement du code HTML dans le navigateur avant le traitement de la pagination, donc il n'y avait rien sur la page. J'ai donc mis{% block content %}
à l'intérieur de{% load paginate %}
et il s'est affiché avec succès.{% block content %}
Les noms de variables ne sont pas uniformes.
La balise{% include %}
hérite des variables du home.html actuel, et les variables du home.html sont passées parviews.home
{'post_list': post_list}
, c'est-à-dire que le nom de la variable'post_list'
pointe vers l'objetpost_list
, et vous êtes tous utilisés dans le modèle sont'article_list'
, et ce nom de variable ne pointe vers aucun objet.