Как исправить пагинацию при наличии фильтра GET из URL?
На главной странице просмотра товаров (www.url.com/works) пагинация работает хорошо (отображается 10 товаров за раз) и URL становится www.url.com/works/?page=2
В том же представлении работы можно фильтровать по категориям (т.е. www.url.com/works/?collection=Drawing). Поскольку используется тот же вид, он по-прежнему пагинация на 10, но если я щелкаю другие страницы, он теряет /?collection=Drawing и просто возвращается к www.url.com/works/?page=2.
Как их объединить, чтобы получилось что-то вроде www.url.com/works/?collection=Drawing&page=2?
Спасибо!
views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from url_filter.filtersets import ModelFilterSet
class ProductListView(ListView):
model = Product
template_name = "products/product_all.html"
paginate_by = 10
def get_queryset(self, *args, **kwargs):
sold = ProductPurchase.objects.filter(
refunded=False
).values_list('product_id')
qs = super(ProductListView, self).get_queryset(**kwargs)
qs = qs.filter(for_sale=True, test_check=False).exclude(id__in=sold).order_by('-timestamp')
categoryfilter = self.request.GET.get("collection")
if categoryfilter:
qs = qs.filter(
Q(category__name__icontains=categoryfilter)
)
query = self.request.GET.get("q")
if query:
tags = Tag.objects.filter(
slug=query
).values_list('products')
qs = qs.filter(
Q(title__icontains=query) |
Q(description__icontains=query) |
Q(material__icontains=query) |
Q(id__in=tags)
).order_by("title")
return MyFilterSet(data=self.request.GET, queryset=qs).filter()
product_all.html
Вы можете добавить метод к представлению для получения URL-кодированного набора запросов всех элементов, кроме страницы с:
class ProductListView(ListView):
# …
def querystring_url(self):
data = self.request.GET.copy()
data.pop(self.page_kwarg, None)
return data.urlencode()
Затем в шаблоне можно написать ссылку на страницу, например, так:
<a href="?page={{ page_obj.previous_page_number }}&{{ view.querystring_url }}">…</a>
Вы должны обновить все ссылки с другой страницы так, чтобы они использовали querystring_url
представления.