Пагинация Django + фильтр

У меня проблема при использовании разбиения на страницы и фильтрации. Я использую django-filter фильтрацию и разбивку на страницы в CBV (ListView). Все работает. Пагинатор заворачивает поле после фильтрации, проблема в кнопках пагинатора в шаблоне. Когда вы нажимаете NEXT или PREV, фильтр сбрасывается. Я нашел решение:

<span><a href="?page={{ page_obj.previous_page_number }}
     {% for key,value in request.GET.items %}
          {% ifnotequal key 'page' %}&{{ key }}={{ value }}{% endifnotequal %}
     {% endfor %}">Previous</a>
</span>

Но это не решает проблему полностью, поэтому я могу отправить запрос из своего фильтра:

?item_title=&description=&ordering=&popular=&min_price=&max_price=&category_brands=11&category_brands=13

И так как у меня есть две категории_брендов = в URL-адресе, и это решение не работает, потому что у меня не может быть двух одинаковых ключей. Помогите мне, пожалуйста.


person Roman Nozhenko    schedule 28.11.2017    source источник
comment
Я думаю, проблема в организации ваших параметров: ?item_title=&description=&ordering=&popular=&min_price=&max_price=&category_brands=11&category_brands=13. Поиск немного связан с этим. =& кажется странным...   -  person Dalton Cézane    schedule 28.11.2017
comment
Привет, & - это как вставка значений из поля запроса. если значение в фильтре ==› min_price=1&category_brands=13 и если не min_price=&category_brands   -  person Roman Nozhenko    schedule 30.11.2017
comment
просто указанный мной способ сюда не подходит, может есть другое решение, как совместить пагинацию с фильтром, и чтобы они не перекрывали друг друга   -  person Roman Nozhenko    schedule 30.11.2017
comment
Я думаю, вы должны указать значения для своих свойств. Например: item_title=some_value_here&description=another_value&ordering=some_value&... .   -  person Dalton Cézane    schedule 30.11.2017


Ответы (1)


Нашел решение: //tamplate_tag

@register.simple_tag(takes_context=True)
def url_replace(context, **kwargs):
query = context['request'].GET.copy()

for kwarg in kwargs:
    try:
        query.pop(kwarg)
    except KeyError:
        pass

query.update(kwargs)

return mark_safe(query.urlencode())

в шаблоне:

{% load <your_templatetag_name> %}
...
<a href="?{% url_replace page=page_obj.previous_page_number %}">Previous</a>
...
<a href="?{% url_replace page=page_obj.next_page_number %}">Next</a>

Меня устраивает.

person Roman Nozhenko    schedule 11.12.2017