boldRichard
boldRichard

Reputation: 65

filter to pagination django

implemented sorting and pagination on the product page, but sorting gets confused when moving to the next page. How do I apply a filter to all pagination pages?and i got smth weird with dropdown selection: after moving to next pages it starts act like crazy,after choosing a filter and refreshing the page, it returns to the default value and seems to be changing places (exmp: $$-$ -> $-$$ and vice versa , and i must guess who is who :) )

template

<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>

views

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', )

pagination

{% 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 %}

Upvotes: 0

Views: 152

Answers (1)

markwalker_
markwalker_

Reputation: 12869

You are only passing the new page number with the pagination link, so any other parameters that may have been involved in filtering will get lost on the new page.

You need a way to maintain the extra GET params. One way to do this might be a template tag that you can pass the new page number to;

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()

Then in your template the next (and previous) links would use that tag:

{% 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 %}

Upvotes: 1

Related Questions