В том случае когда, количество отображаемых данных велико, разумеется имеет смысл выводить данные порциями. Как для удобства пользователей, так и с точки зрения производительности. Хотя на мой взгляд как будет быстрее, с помощью пагинации в представлениях 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 %}