【问题标题】:How to implement paginator in search results如何在搜索结果中实现分页器
【发布时间】:2020-05-01 21:22:21
【问题描述】:

我能够从搜索结果中显示的所有类别中获取我的所有项目,现在我必须在我的搜索结果中为已搜索的类别中的所有项目添加分页器。如何在搜索结果上实现分页器以显示分页类别中的所有项目?使用下面的代码,搜索结果不会正确地对所有项目类别进行分页。我不知道 itertool 是否会是一个更好的主意。

def search_result(request):
  query = request.GET.get('q')
  if query is None:
      return redirect("shop:homepage")
  else:
      item = Item.objects.all().order_by("timestamp")
      if item:
          item = item.filter(
                  Q(title__icontains=query)  
              ).distinct()

  if item.count() == 0:
      messages.error(request, "No search results found")

  paginator = Paginator(item, 1)
  page = request.GET.get('page')
  try:
      queryset = paginator.get_page(page)
  except PageNotAnInteger:
      queryset = paginator.get_page(1)
  except EmptyPage:
      queryset = paginator.get_page(paginator.num_pages)

  context = {
      'search': item,
      'pagination': queryset,
      'query': query,
  }
  return render(request, 'search_result.html', context)
    <nav class="my-4 flex-center" style="font-weight:400">
      {% if pagination.has_other_pages %}
      <ul class="pagination pagination-circle pg-blue mb-0">

      {% if pagination.has_previous %}
      <li class="page-item">
      <a class="page-link" href="?page={{ pagination.previous_page_number }}" aria-label="Previous">
      <span aria-hidden="true">Previous</span>
      <span class="sr-only">Previous</span>
      </a>
      </li>
      {% endif %}

      {% for i in pagination.paginator.page_range %}
      {% if pagination.number == i %}
      <li class="page-item active"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
      <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
      {% endfor %}

      {% if pagination.has_next %}
      <li class="page-item">
      <a class="page-link" href="?page={{ pagination.next_page_number }}"aria-label="Next">
        <span aria-hidden="true">Next</span>
        <span class="sr-only">Next</span>
      </a>
      </li>
      {% endif %}

      </ul>
      {% endif %}
      </nav>

【问题讨论】:

标签: python django pagination paginator


【解决方案1】:

有两种方法可以从 Paginator 对象“Paginator.get_page”和“Paginator.page”访问页面。如果给定的页面不是数字,get_page 方法不会引发任何异常,但 Paginator.page 会。您正在使用“get_page”方法,但捕获了PageNotAnInteger 异常,该异常仅由Paginator.page 方法引发。

来自 Django 文档

Paginator.get_page(number) -> 返回一个 Page 对象 给定基于 1 的索引,同时处理超出范围和无效页面 数字。

如果页面不是数字,则返回第一页。如果页面 number 为负数或大于页数,则返回 最后一页。

仅当您指定 Paginator(..., allow_empty_first_page=False) 并且 object_list 为空。

Paginator.page(number) 返回给定的 Page 对象 基于 1 的索引。如果给定的页码不存在,则引发 InvalidPage 存在。

Possibility: Seems like page number you are getting via query string isn't a valid number

用page方法显式改变get_page方法


   page = request.GET.get('page')
    try:
        pagination= paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        pagination = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        pagination = paginator.page(paginator.num_pages)

     context = {
      'search': item,
      'pagination': pagination,
      'query': query,
     }
  return render(request, 'search_result.html', context)

使用登录服务器或浏览器中的开发工具来检查查询字符串中的页码是否正常

【讨论】:

  • @naveen ...谢谢。现在的问题是,当我搜索一个项目时,我会得到来自不同类别的所有项目的结果。当我得到搜索结果时,如何为所有项目创建分页器。
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多