【问题标题】:Django paginator issueDjango分页器问题
【发布时间】:2021-04-03 13:30:54
【问题描述】:

我目前正在开发一个 django 博客,我编写了一个搜索栏,您可以在其中输入内容,如果有任何帖子包含您在标题中输入的内容,它应该会显示所有帖子。这部分写得非常好。但是,分页存在错误。正如您将在views.py 中看到的那样。每页的最大帖子数为 3。但是,您可以看到有 4 个。但是,分页器检测到第四个帖子应该有另一个页面。这是一张图片。

这里是views.py:

class ElementSearchView(View):
    elements_list = Element.objects.all()


    def get(self, request, *args, **kwargs):

        paginator = Paginator(self.elements_list, 3)
        page_request_var = 'page'
        page = request.GET.get(page_request_var)
        try:
            paginated_queryset = paginator.page(page)
        except PageNotAnInteger:
            paginated_queryset = paginator.page(1)
        except EmptyPage:
            paginated_queryset = paginator.page(paginator.num_pages)
        queryset = Element.objects.all()
        query = request.GET.get('q')
        if query:
            queryset = queryset.filter(
                Q(title__icontains=query) 
            ).distinct()

        context = {
            'query': queryset,
            'queryset': paginated_queryset,
            'page_request_var': page_request_var,
        }
        return render(request, 'periodic/search_results_table.html', context)

这是 html 模板:分页在模板的末尾。

{% load static %}


<html>
{% include 'periodic/head_search.html' %}
<body>
    {% include 'periodic/header.html' %}
<br>
<br>
<div class="container">
  <div class="row">
    <!-- Latest Posts -->
    <main class="posts-listing col-lg-8"> 
      <div class="container">
        <div class="row">
          <!-- post -->
          {% for element in query %}
          <div class="post col-xl-6 wrap-login100">
            <div class="post-thumbnail"><a href="{{ element.get_absolute_url }}"><img src="{{ element.thumbnail.url }}" alt="..." class="img-fluid"></a></div>
            <div class="post-details">
              <a href="{{ element.get_absolute_url }}">
                <h3 class="h4">{{ element.title }}</h3></a>
            </div>
          </div>
          {% endfor %}
        </div>
        <!-- Pagination -->
        <nav aria-label="Page navigation example">
          <ul class="pagination pagination-template d-flex justify-content-center">
            {% if queryset.has_previous %}                
            <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.previous_page_number }}" class="page-link"> <i class="fa fa-angle-left"></i></a></li>
            {% endif %}
            <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.number }}" class="page-link active">{{ queryset.number }}</a></li>
            {% if queryset.has_next %}
            <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.next_page_number }}" class="page-link"> <i class="fa fa-angle-right"></i></a></li>
            {% endif %}
          </ul>
        </nav>

        {% if is_paginated %}
        
        <nav aria-label="Page navigation example">
          <ul class="pagination pagination-template d-flex justify-content-center">
            {% if page_obj.has_previous %}                
            <li class="page-item"><a href="?{{ page_request_var }}={{ page_obj.previous_page_number }}" class="page-link"> <i class="fa fa-angle-left"></i></a></li>
            {% endif %}
            <li class="page-item"><a href="?{{ page_request_var }}={{ page_obj.number }}" class="page-link active">{{ page_obj.number }}</a></li>
            {% if page_obj.has_next %}
            <li class="page-item"><a href="?{{ page_request_var }}={{ page_obj.next_page_number }}" class="page-link"> <i class="fa fa-angle-right"></i></a></li>
            {% endif %}
          </ul>
        </nav>
        
        {% endif %}
      </div>
    </main>
</body>
{% include 'periodic/scripts_search.html' %}
</html>

【问题讨论】:

  • 因为您循环的是原始查询集,而不是模板中的分页查询集
  • 你是怎么解决的?我这样说是因为我刚刚意识到我在代码的其他部分也有同样的问题,但我不知道如何解决它
  • @Marcgames_YT 你看到我的回答了吗?它对你的问题有帮助吗?请更新状态。

标签: python html django


【解决方案1】:

正如用户@ikilnac 提到的,

您正在循环遍历原始查询集,而不是模板中的分页查询集

这只是意味着在你的循环中,你这样做

  {% for element in query %}
  <div class="post col-xl-6 wrap-login100">
    <div class="post-thumbnail"><a href="{{ element.get_absolute_url }}"><img src="{{ element.thumbnail.url }}" alt="..." class="img-fluid"></a></div>
    <div class="post-details">
      <a href="{{ element.get_absolute_url }}">
        <h3 class="h4">{{ element.title }}</h3></a>
    </div>
  </div>
  {% endfor %}

然后,您将{% if queryset.has_previous %} 形式的标签与原始查询集一起使用,而不是模板中的分页标签(query)。
这里有一个很好的例子 - Paginate with Django

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多