过滤到分页django



在产品页面上实现了排序和分页,但当移动到下一页时,排序会变得混乱。如何将筛选器应用于所有分页页面?我对下拉选择感到奇怪:在移动到下一页后,它开始表现得像疯了一样,在选择过滤器并刷新页面后,它返回到默认值,并且似乎在更改位置(例如:$$-$->$-$$,反之亦然,我必须猜测谁是谁:(

模板

<div class="product-sorting d-flex">
<p>Sort by:</p>
<form name="selectForm" action="{% url 'shop' %}" method="get">
<label for="orderby"></label>
<select name="orderby" id="orderby" onchange="selectForm.submit();">
<option value="price">price: $$ - $</option>
<option value="-price">price: $ - $$</option>
</select>
<input type="submit" class="d-none" value="submit">
</form>
</div>

视图

class Shop(ListView):
template_name = 'essense/shop.html'
context_object_name = 'items'
paginate_by = 9
allow_empty = False
model = Item
def get_context_data(self, *, object_list=None, **kwargs):
***context***

def get_ordering(self):
return self.request.GET.get('orderby', )

分页

{% if page_obj.has_other_pages %}
</div>
<nav aria-label="navigation">
<ul class="pagination mt-50 mb-70">
{% if page_obj.has_previous %}
<li class="page-item"><a class="page-link"
href="?page={{ page_obj.previous_page_number }}"><i
class="fa fa-angle-left"></i></a>
</li>
{% endif %}
{% for p in page_obj.paginator.page_range %}
{% if page_obj.number == p %}
<li class="page-item"><a class="page-link" href="#">{{ p }}</a></li>
{% elif p > page_obj.number|add:-3 and p < page_obj.number|add:+3 %}
<li class="page-item"><a class="page-link" href="?page={{ p }}">{{ p }}</a>
</li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item"><a class="page-link"
href="?page={{ page_obj.next_page_number }}"><i
class="fa fa-angle-right"></i></a></li>
{% endif %}
</ul>
</nav>
</div>
</div>
{% endif %}

您只传递带有分页链接的新页码,因此可能参与筛选的任何其他参数都将在新页面上丢失。

您需要一种方法来维护额外的GET参数。一种方法可能是使用一个模板标记,您可以将新页码传递给该标记;

project/templatetags/pagination_tags.py:

from django import template
register = template.Library()

@register.simple_tag
def url_replace(request, field, value):
d = request.GET.copy()
d[field] = value
return d.urlencode()

然后在你的模板中,下一个(和上一个(链接将使用这个标签:

{% load pagination_tags %}

{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?{% url_replace request 'page' page_obj.next_page_number %}">
<i class="fa fa-angle-right"></i>
</a>
</li>
{% endif %}

最新更新