Как указал @WillemVanOnsem, проблема не в представлении, а в URL-адресах в шаблоне (templates / pagination / listview. html). Ранее кнопка next имела href="?page={{ page_obj.next_page_number }}"
, что означало, что request.GET
будет содержать только номер страницы для разбивки на страницы, а не другой фильтр и порядок по критериям.
Тогда было решено добавить request.GET.urlencode
к href
как
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}&{{ request.GET.urlencode }}">Next</a>
Однако это не полное исправление, поскольку простое добавление request.GET
также добавляет номер страницы, которую вы ' в настоящее время в. Проще говоря, если вы перейдете со страницы 1 на 2 на 3, вы получите URL, который выглядит как
http://localhost:8000/listview/?page=1&page=2&page=3...
request.GET
- это QueryDict, подобный <QueryDict: {'page': ['1'], ...}>
. Решением этой проблемы было простое добавление параметра page
, однако, поскольку request.GET
является неизменным, сначала вы должны сделать его копию. По сути, я добавил следующие строки в метод get_context_data
в ListVew
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Form List View'
context['filter_form'] = forms.FilterListView(self.request.GET)
get_copy = self.request.GET.copy()
if get_copy.get('page'):
get_copy.pop('page')
context['get_copy'] = get_copy
return context
И в шаблоне я назвал объект get_copy
, например href="?page={{ page_obj.next_page_number }}&{{ get_copy.urlencode }}"
Для всего примера шаблона следуйте templates / pagination / listview. html
Не самое элегантное решение, но я считаю, что большинству людей его достаточно просто использовать.