Как внедрить пагинатор в результаты поиска - PullRequest
0 голосов
/ 15 января 2020

Я могу получить все свои товары из всех категорий, отображаемых в результатах поиска, теперь я должен добавить в свой результат поиска paginator для всех предметов в категориях, которые искали. Как я могу внедрить paginator в результаты поиска для отображения всех элементов в разбивке по страницам? С моим кодом ниже, результаты поиска не разбивают на страницы всех категорий должным образом. Я не знаю, будет ли 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>

1 Ответ

0 голосов
/ 15 января 2020

Существует два метода доступа к страницам из объекта Paginator: "Paginator.get_page" и "Paginator.page". Где метод get_page не вызывает никаких исключений, если данная страница не является числом, а Paginator.page. Вы используете метод "get_page", но перехватываете исключение PageNotAnInteger, где это исключение вызывается только методом Paginator.page.

Из Django документации

Paginator.get_page (number) -> Возвращает объект страницы с данным индексом на основе 1, а также обрабатывает недопустимые и недопустимые номера страниц .

Если страница не является числом, возвращается первая страница . Если номер страницы отрицательный или превышает количество страниц, возвращается последняя страница.

Вызывает исключение EmptyPage , только если вы указали Paginator (..., allow_empty_first_page = False) и список_объектов пуст.

Paginator.page (number) Возвращает объект Page с указанным индексом на основе 1. Вызывает InvalidPage, если заданный номер страницы не существует.

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

Чтобы сделать это явным, измените метод 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)

Используйте вход на сервер или инструменты разработчика в браузере, чтобы проверить, хорошо ли идет номер страницы в строке запроса

...