@Lepilov

Как заставить работать пагинацию и фильтрацию на одной странице?

До добавления фильтра, пагинация отрабатывала без проблем. Добавил фильтр на основе django-filters, и теперь только первая страница отдает верный контекст, начиная со второй страницы - отображается полный список экземпляров. При переходе на любую страницу пагинации, вывод самой пагинации пропадает. Это поведение соответствует отображения объектов при отработке фильтра. Т.к. изначально я не ставил задачу добавлять пагинацию к результатам фильтра, а применять ее только к полному нефильтрованному списку.

Я думаю, что проблема в reques.GET, содержащемся в шаблоне для получения фильтрованных значений. Получается, что и фильтр и пагинация используют метод GET, при переходе на вторую страницу пагинации срабатывает условие if request.GET для фильтра, а так как фильтр не содержит ограничений отдается полный список элементов со всех страниц. Возможно я ошибаюсь и причина в другом. Помогите разобраться, как подружить пагинацию и фильтрацию.

{% block content %}
    <!-- Page Content -->
    <div class="container">

      <!-- Filter -->
      <header class="custom-top">
          <form method="get">   ### filters form
          <div class="well">
          <div class="row">
            <div class="form-group col-sm-4 col-md-3 ">
                <b>{{ filter.form.direction.label_tag }}</b>
                <div class="clear"></div>
              {% render_field filter.form.direction class="custom-multiple-select" %}
            </div>              
              <div class="form-group col-sm-4 col-md-3">
                  <b>{{ filter.form.group.label_tag }}</b>
                  <div class="clear"></div>
              {% render_field filter.form.group class='custom-select' %}
              </div>
          </div>
          <div class="row">
            <div class="form-group col-sm-4 col-md-3">
              <input type="submit" value="Apply" class="btn btn-success filter-button">
                <a href='{% url 'trainers:viewtrainers' trainer_city %}' class="btn btn-secondary filter-button float-lg-right">Clear</a>
            </div>
          </div>
          </div>
         </form>
      </header>

{%  if request.GET  %}   ### if filters apply
    <div class="row text-center">
   {% for trainer in filter.qs %}
          {% if trainer.is_active %}
        <div class="col-lg-3 col-md-6 mb-4">
          <div class="card h-100">
            {% if trainer.img %}
            <div class="cardimg">
            <img class="card-img-top" src="{{ MEDIA_URL }}{{ trainer.img.url }}">
            </div>
            {% else %}
            <img class="card-img-top" src="http://placehold.it/700x400">
            {% endif %}
                <div class="card-body ">
                  <h4 class="card-title">
                  <a href="{% url 'trainers:viewperson' trainer.slug %}">{{ trainer.name }}</a>
                  </h4>
                </div>
          </div>
        </div>
{% endif %}
   {% endfor %}
    </div>
      <!-- Page Features -->
       {% else %}      ### if filter is not used
      {% if trainers %}
      <div class="row text-center">             
        {% for trainer in trainers %}
        {% if trainer.is_active %}
        <div class="col-lg-3 col-md-6 mb-4">                   
          <div class="card h-100">
            {% if trainer.img %}
            <div class="cardimg">          
            <img class="card-img-top" src="{{ MEDIA_URL }}{{ trainer.img.url }}"> 
            </div>    
            {% else %}
            <img class="card-img-top" src="http://placehold.it/700x400">
            {% endif %}
                <div class="card-body ">
                  <h4 class="card-title">
                  <a href="{% url 'trainers:viewperson' trainer.slug %}">{{ trainer.name }}</a>
                  </h4>
                </div>      
          </div>
        </div>
        {% endif %}
        {% endfor %}

        </div>
             <!-- Pagination-->  ### Paginations
    {% if trainers.has_other_pages %}
      <ul class="pagination justify-content-center" style="margin:20px 0">
        {% if trainers.has_previous %}
          <li class="page-item"><a class="page-link" href="?page={{ trainers.previous_page_number }}">&laquo;</a></li>
        {% else %}
          <li class="page-item disabled"><span class="page-link" >&laquo;</span></li>
        {% endif %}
        {% for i in trainers.paginator.page_range %}
          {% if trainers.number == i %}
            <li class="page-item active"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span></li>
          {% else %}
            <li><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
          {% endif %}
        {% endfor %}
        {% if trainers.has_next %}
          <li class="page-item"><a class="page-link" href="?page={{ trainers.next_page_number }}">&raquo;</a></li>
        {% else %}
          <li class="page-item disabled"><span class="page-link" >&raquo;</span></li>
        {% endif %}
      </ul>
    {% endif %}
{% endif %}

      </div>
    <!-- /.container -->

{% endblock content %}
  • Вопрос задан
  • 702 просмотра
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
1) https://stackoverflow.com/questions/48546864/djang...

2) см. django-tables + django-filter совместное использование
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы