Простая пагинация в CBV представлениях на примере ListView

В том случае когда, количество отображаемых данных велико, разумеется имеет смысл выводить данные порциями. Как для удобства пользователей, так  и с точки зрения производительности. Хотя на мой взгляд как будет быстрее, с помощью пагинации в представлениях Django или же например Javascript-библиотекой Datatables.  Если бы не образовательные эксперименты с фейерверком Django я бы наверное заюзал второе.

Итак первым делом описываем наше представление

class DoctorListView(ListView):
    model = Doctor
    paginate_by = 10
    context_object_name = 'doctors'

Следующим шагом нам остается прописать код в шаблоне, после чего мы должны получить простую и рабочую пагинацию.

   {% if is_paginated %}
        <nav>
            <ul class="pager">
                {% if page_obj.has_previous %}
                    <li><a href="?page={{ page_obj.previous_page_number }}">Предыдущая</a></li>
                {% endif %}

                    Страница {{ page_obj.number }} из {{ paginator.num_pages }}.

                {% if page_obj.has_next %}
                    <li><a href="?page={{ page_obj.next_page_number }}">Следующая</a></li>
                {% endif %}
            </ul>
        </nav>
    {% endif %}

Если потребуется вывести еще и номера всех страниц, полученных в результате пагинации, то нужно просто перебрать, все элементы списка объекта  page_obj.paginator.page_range

{% if page_obj.paginator.num_pages > 1 %}
    <nav>
        <ul class="pagination">
            {% if page_obj.has_previous %}
                <li>
                    <span aria-hidden="true">
                        <a href="{% url 'patient_list' %}?page={{ page_obj.previous_page_number }}">&laquo;</a>
                    </span>
                </li>
            {% else %}
                <li>
                    <span aria-hidden="true">
                        <a href="#">&laquo;</a>
                    </span>
                </li>
            {% endif %}
            {% for pn in page_obj.paginator.page_range %}
                <li>
                    <span>
                        <a href="{% url 'patient_list' %}?page={{ pn }}">{{ pn }}</a>
                    </span>
                </li>
            {% endfor %}
            {% if page_obj.has_next %}
                <li>
                    <span>
                        <a href="{% url 'patient_list' %}?page={{ page_obj.next_page_number }}">&raquo;</a>
                    </span>
                </li>
            {% else %}
                <li>
                    <span>
                        <a href="#  ">&raquo;</a>
                    </span>
                </li>
            {% endif %}
        </ul>
    </nav>
{% endif %}

Вам также может понравиться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика