当URL中有GET筛选器时,我如何修复分页



在主产品浏览页面(www.url.com/works(中,分页效果良好(一次显示10个项目(,url变为www.url.com.works/?第2页

在同一视图中,可以按类别过滤作品(即www.url.com/works/?collection=Drawing(。由于它使用相同的视图,它仍然按10分页,但如果我单击其他页面,它将丢失/?collection=绘图,然后返回到www.url.com/works/?page=2.

如何将它们组合为类似于www.url.com/works/的内容?collection=绘图&第2页?

谢谢!

视图.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

<section class="mt-5">
<div class="container">

<div class="row mx-1 mb-5">
<div class="py-0 my-0">
<span class="hero-heading px-2 mr-2 text-sm"><a href="{% url 'products:list' %}">All</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Painting">Painting</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Drawing">Drawing</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Print">Print</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Sculpture">Sculpture/ Installation</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Textiles">Textiles</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Photography">Photography</a></span>
<span class="hero-heading px-2 mr-2 text-sm"><a href="?collection=Mixed media">Mixed media</a></span>
</div>
</div>

<div class="row">
<!-- Grid -->
<div class="products-grid col-xl-12 col-lg-8 order-lg-2">

<div class="card-columns product-columns">
{% include "products/product_list_snippet.html" with object_list=products %}

</div>

<nav aria-label="page navigation" class="d-flex justify-content-center mb-5 mt-3">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item"><a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous" class="page-link"><span aria-hidden="true">Prev</span><span class="sr-only">Previous</span></a></li>
{% endif %}
{% for i in paginator.page_range %}
{% if page_obj.number == i %}
<li class="page-item active"><a href="#" class="page-link">{{ i }}</a></li>
{% else %}
<li class="page-item"><a href="?page={{ i }}" class="page-link">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item"><a href="?page={{ page_obj.next_page_number }}" aria-label="Next" class="page-link"><span aria-hidden="true">Next</span><span class="sr-only">Next     </span></a></li>

{% endif %}
</ul>
</nav>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function() {

var btn = $('#button');
$(window).scroll(function() {
if ($(window).scrollTop() > 300) {
btn.addClass('show');
} else {
btn.removeClass('show');
}
});
btn.on('click', function(e) {
e.preventDefault();
$('html, body').animate({scrollTop:0}, '1000');
});
});
</script>

</div>
</div>

您可以向视图中添加一个方法,以获得除具有以下的页面之外的所有项目的URL编码查询集

class ProductListView(ListView):
# …
defquerystring_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

最新更新