Django用模板標(biāo)簽templatetags分頁文章html傳入?yún)?shù)后context無返回或者是參數(shù)是沒有傳入模板函數(shù)?
我按照這篇https://segmentfault.com/a/11...的方法去實(shí)現(xiàn)一個(gè)分頁功能。原本用django系統(tǒng)的painator是可以實(shí)現(xiàn)分頁的,只是把全部頁碼都輸出到html里,文章多了十分不好。于是網(wǎng)上找到這篇文章,使用的是templatetags模板標(biāo)簽去實(shí)現(xiàn)分頁,可以參考django官方文檔https://docs.djangoproject.co...。我用了里面的simple_tag(),運(yùn)行之后沒有報(bào)錯(cuò),但是文章內(nèi)容分頁導(dǎo)航什么都不顯示了。后來我嘗試了在下面第二段代碼的def paginate(context, object_list, page_count)里估計(jì)把一些代碼寫錯(cuò),運(yùn)行之后居然也沒有報(bào)錯(cuò),我就懷疑在我的html里{% paginate post_list 3 %}是不是沒有傳入?yún)?shù)失效,還是paginate方法沒有運(yùn)行???下面的context標(biāo)簽上下文{{ article_list }},{{ article.title}}以及后面的也都是無效的,html沒有顯示任何東西。折騰了幾天了,求大神解救!告訴我哪里出錯(cuò)了,可以的話貼一下代碼,感激不盡!
1.這是我的app應(yīng)用,放置templatetags目錄的地方
__init__.py
models.py
templatetags/
__init__.py
paginate_tag.py
views.py
model.py
2.下面的是paginate_tag.py的內(nèi)容,實(shí)現(xiàn)分頁和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 '' # 必須加這個(gè),否則首頁會(huì)顯示個(gè)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.這個(gè)是實(shí)現(xiàn)分頁這部分的html代碼
templates/blog/pagination.html
<div id="pagenavi" class="noselect">
{% if article_list.has_previous %} # 判斷是否還有上一頁,有的話要顯示一個(gè)上一頁按鈕
<a class="previous-page" href="?page={{ article_list.previous_page_number }}">
<span class="icon-previous"></span>上一頁
</a>
{% endif %}
# 頁碼號(hào)為1永遠(yuǎn)顯示
{% if first_page == current_page %} # 當(dāng)前頁就是第一頁
<span class="first-page current">1</span>
{% else %} # 否則的話,第一頁是可以點(diǎn)擊的,點(diǎn)擊后通過?page=1的形式把頁碼號(hào)傳遞給視圖函數(shù)
<a href="?page=1" class="first-page">1</a>
{% endif %}
{% if pages_first > 2 %} # 2以前的頁碼號(hào)要被顯示成省略號(hào)了
<span>...</span>
{% endif %}
{% for page in pages %} # 通過for循環(huán)把pages中的值顯示出來
{% if page == current_page %} # 是否當(dāng)前頁,按鈕會(huì)顯示不同的樣式
<span class="current">{{ page }}</span>
{% else %}
<a href="?page={{ page }}">{{ page }}</a>
{% endif %}
{% endfor %}
# pages最后一個(gè)值+1的值小于最大頁碼號(hào),說明有頁碼號(hào)需要被省略號(hào)替換
{% if pages_last < last_page %}
<span>...</span>
{% endif %}
# 永遠(yuǎn)顯示最后一頁的頁碼號(hào),如果只有一頁則前面已經(jīng)顯示了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 %}
# 還有下一頁,則顯示一個(gè)下一頁按鈕
{% if article_list.has_next %}
<a class="next-page" href="?page={{ article_list.next_page_number }}">
下一頁<span class="icon-next"></span>
</a>
{% endif %}
</div>
這里是我的視圖函數(shù)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})
...
最后是我要實(shí)現(xiàn)分頁的頁面home.html
{% load paginate_tags %}
{% paginate post_list 3 %} # context是默認(rèn)傳入的,我把post_list和文章數(shù)傳入,我要實(shí)現(xiàn)每頁3篇文章,所以傳入3
{% for article in article_list %}
<section class="post">
<h1>{{ article.title }}</h1>
<p>{{ article.content }} </p>
...
...
...
</section>
{% include 'pagination.html' %}
....
查看完整描述