2 回答
TA贡献1810条经验 获得超4个赞
正如@WillemVanOnsem 指出的那样,问题不在于视图,而在于模板中的 URL(templates/pagination/listview.html)。以前,下一个按钮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
不是最优雅的解决方案,但我觉得它对大多数人来说足够简单。
TA贡献1877条经验 获得超6个赞
我遇到了同样的问题,我通过下面的链接解决了这个问题。
https://www.caktusgroup.com/blog/2018/10/18/filtering-and-pagination-django/
添加回答
举报
