【问题标题】:Paginator in a view function Django视图函数Django中的分页器
【发布时间】:2020-11-16 23:22:20
【问题描述】:

我正在尝试在我的博客网站的帖子页面上添加分页选项。我想在呈现页面的视图函数上实现分页器,我从 Django 的文档中找到了这个示例,但它不起作用。有什么帮助吗?

查看功能:

def blog(request):
    posts = Post.objects.all().order_by('-date_posted')
    paginator = Paginator(posts, 2)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    context = {
        'posts': posts,
        'page_obj': page_obj,
        'title': 'Blog',
        'banner_page_title': 'Blog',
        'page_location': 'Home / Blog'
    }
    return render(request, 'blog/blog.html', context)

html渲染

<nav class="blog-pagination justify-content-center d-flex">
  <ul class="pagination">
      {% if is_paginated %}
        {% if page_obj.has_previous %}
          <li class="page-item">
              <a href="?page={{ page_obj.previous_page_number }}" class="page-link" aria-label="Previous">
                  <span aria-hidden="true">
                      <span class="ti-arrow-left"></span>
                  </span>
              </a>
          </li>
        {% endif %}

      {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
          <li class="page-item active">
              <a href="?page={{ num }}" class="page-link">{{ num }}</a>
          </li>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
          <li class="page-item">
            <a href="?page={{ num }}" class="page-link">{{ num }}</a>
        </li>
        {% endif %}
      {% endfor %}

      {% if page_obj.has_next %}
        <li class="page-item">
            <a href="?page={{ page_obj.next_page_number }}" class="page-link" aria-label="Next">
                <span aria-hidden="true">
                    <span class="ti-arrow-right"></span>
                </span>
            </a>
        </li>
      {% endif %}
    {% endif %}
  </ul>
</nav>

url 路由

path('blog/', blog, name='blog'),

【问题讨论】:

  • 什么不起作用,你面临什么问题?
  • 它不会在我的页面上呈现分页。我的意思是,它不会显示页数,而是将我的所有帖子呈现在一个页面上。

标签: python django web pagination


【解决方案1】:

删除{% if is_paginated %},因为它没有返回任何值,这就是你看不到任何数字的原因(如果{% endif %},请不要忘记删除更接近的数字)

您可以从page_obj 访问您的分页对象

{% for post in page_obj %}
    {{ post }}
{% endfor %}

这是修改后的 HTML

{% for post in page_obj %}
    {{ post.text }}<br>
{% endfor %}


<nav class="blog-pagination justify-content-center d-flex">
    <ul class="pagination">
        {% if page_obj.has_previous %}
        <li class="page-item">
            <a href="?page={{ page_obj.previous_page_number }}" class="page-link" aria-label="Previous">
                <span aria-hidden="true">
                    <span class="ti-arrow-left"></span>
                </span>
            </a>
        </li>
        {% endif %}

    {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
        <li class="page-item active">
            <a href="?page={{ num }}" class="page-link">{{ num }}</a>
        </li>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li class="page-item">
            <a href="?page={{ num }}" class="page-link">{{ num }}</a>
        </li>
        {% endif %}
    {% endfor %}

    {% if page_obj.has_next %}
        <li class="page-item">
            <a href="?page={{ page_obj.next_page_number }}" class="page-link" aria-label="Next">
                <span aria-hidden="true">
                    <span class="ti-arrow-right"></span>
                </span>
            </a>
        </li>
    {% endif %}
    </ul>
  </nav>

【讨论】:

  • 我尝试删除该 if 语句并且也不起作用,我没想过使用 for 进行迭代,我现在尝试了,但它仍然不起作用。
  • 您能用所做的更改更新您的 HTML 模板吗?我让它在我的测试项目上工作。
  • 究竟如何?我的意思是当我保存更改并重新启动服务器时,html文件不是自己更新的吗?我真的被卡住了,因为我找不到任何错误,这个更新我该怎么做?
  • 我用 HTML 模板代码更新了我的答案(进行了更改)。试试看,告诉我你是否能看到分页。
  • 哦.. 现在我明白了问题所在。我在这样的 {% for post in posts %} 中渲染帖子,从第一次开始我不明白你对那个 for 循环是什么意思,之后我接受并更改了 for 循环,现在一切完美运行。谢谢!!
猜你喜欢
  • 2013-12-25
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2017-05-08
  • 1970-01-01
  • 2019-03-18
  • 2014-10-12
相关资源
最近更新 更多