Пагинация в фильтрованном наборе запросов с помощью Django Listview

У меня возникла проблема при использовании пагинации в общем ListView, когда я пытаюсь отфильтровать набор запросов. Фильтр работает нормально, но при попытке обратиться к странице, которая не является первой, возникает ошибка: Invalid page (2): Эта страница не содержит результатов

Что если я уберу всю пагинацию? Что бы вы порекомендовали? Цель шаблона - показать в списке отфильтрованные по дате продажи, а также фильтр клиентов

Вот мой код:

class ListSales(LoginRequiredMixin, ListView):
    template_name = "sales/list.html"
    context_object_name = 'sales'
    login_url = reverse_lazy('users_app:user-login')
    paginate_by = 5

    def get_queryset(self):
        client = self.request.GET.get("clientselect", "")
        date1 = self.request.GET.get("date1", '')
        date2 = self.request.GET.get("date2", '')

        if date1 == '':
            date1 = datetime.date.today()
        if date2 == '':
            date2 = datetime.date.today()
        queryset = Sale.objects.get_sales_list(date1, date2, client)
        return queryset

А это мой шаблон:

Причина неудачи заключается в том, что если вы щелкните на следующей странице, остальная часть строки запроса (параметры поиска) не будет передана в следующий запрос.

Оставшуюся часть строки запроса можно закодировать с помощью:

class ListSales(LoginRequiredMixin, ListView):
    # …
    
    def urencode_filter(self):
        qd = self.request.GET.copy()
        qd.pop(self.page_kwarg, None)
        return qd.urencode()

В ссылках на другие страницы, вы затем добавляете значение urlencode_filter() с:

<li><a href="?page={{ page_obj.previous_page_number }}&amp;{{ view.urlencode_filter }}" style="color: wheat;">&laquo;</a></li>

и сделайте это с всеми ссылками на предыдущие, следующие и произвольные страницы.

Вы также можете создать собственный тег шаблона param_replace, чтобы обновить только один параметр запроса и сохранить все остальные:

<a href="?{% param_replace page=page_obj.previous_page_number %}">&laquo;</a>

Подробнее см: https://www.caktusgroup.com/blog/2018/10/18/filtering-and-pagination-django/ и https://stackoverflow.com/a/22735278/10987661

Вернуться на верх