Пагинация в фильтрованном наборе запросов с помощью 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 }}&{{ view.urlencode_filter }}" style="color: wheat;">«</a></li>
и сделайте это с всеми ссылками на предыдущие, следующие и произвольные страницы.
Вы также можете создать собственный тег шаблона param_replace, чтобы обновить только один параметр запроса и сохранить все остальные:
<a href="?{% param_replace page=page_obj.previous_page_number %}">«</a>
Подробнее см: https://www.caktusgroup.com/blog/2018/10/18/filtering-and-pagination-django/ и https://stackoverflow.com/a/22735278/10987661