찾다

 >  Q&A  >  본문

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

我按照这篇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>
  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 %}
    <section class="post">
        <h1>{{ article.title }}</h1>
        <p>{{ article.content }} </p>
        ...
        ...
        ...
    </section>
    {% include 'pagination.html' %}
....
巴扎黑巴扎黑2803일 전901

모든 응답(2)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-18 10:00:17

    열심히 답변해주신 위의 두 분, 특히 프로젝트를 작성해 이메일로 보내주신 @tcztzy에게 감사드립니다. 정말 죄송합니다, @梦 Chaser, 코드 문제가 아닙니다. 제가 저지른 단순한 실수입니다. 이유는 home.html에 {% extends base.html %}를 사용한 다음 home.html의 html 콘텐츠를 <🎜로 래핑했기 때문입니다. > 핵심은 {% block content %} 외부의 home.html 두 번째 줄에 {% load paginate %}을 넣었다는 것입니다. 이로 인해 페이지 매김이 처리되기 전에 html이 브라우저에 로드되어 페이지에 아무것도 남지 않게 되었습니다. 그래서 {% block content %} 안에 {% load paginate %}를 넣었더니 성공적으로 표시되었습니다. {% block content %}

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 10:00:17

    변수 이름이 일정하지 않습니다.

    {% include %} 태그는 현재 home.html의 변수를 상속하고 home.html의 변수는 views.home{'post_list': post_list}에 의해 전달됩니다. 즉, 변수 이름 'post_list'은 <🎜 개체를 가리킵니다. >이고 템플릿에 사용된 것은 모두 post_list이며, 이 변수 ​​이름은 어떤 객체도 가리키지 않습니다. 'article_list'

    회신하다
    0
  • 취소회신하다