Как исправить пагинацию при наличии фильтра 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 }}&amp;{{ view.querystring_url }}">…</a>

Вы должны обновить все ссылки с другой страницы так, чтобы они использовали querystring_url представления.

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