Некорректная работа по нумерации страниц после добавления фильтра - PullRequest
0 голосов
/ 28 августа 2018

Перед добавлением фильтра разбиение на страницы работало без проблем. Добавлен фильтр на основе django-фильтров, и теперь только первая страница дает правильный контекст, начиная со второй страницы - отображается полный список экземпляров.

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

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

templates.html

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