В том случае когда, количество отображаемых данных велико, разумеется имеет смысл выводить данные порциями. Как для удобства пользователей, так и с точки зрения производительности. Хотя на мой взгляд как будет быстрее, с помощью пагинации в представлениях 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 }}">«</a> </span> </li> {% else %} <li> <span aria-hidden="true"> <a href="#">«</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 }}">»</a> </span> </li> {% else %} <li> <span> <a href="# ">»</a> </span> </li> {% endif %} </ul> </nav> {% endif %}