Охватываемые темы: Включение пагинации, Шаблон с пагинацией, Пагинация с фильтрами, Ручная пагинация (в function-based views).
Включение пагинации
from django.views.generic import ListView
from .models import Task
class TaskListView(ListView):
model = Task
template_name = 'tasks/task_list.html'
context_object_name = 'tasks'
paginate_by = 20 # объектов на страницу
ordering = ['-created_at']
Шаблон с пагинацией
{% for task in tasks %}
<div>{{ task.title }}</div>
{% endfor %}
{% if is_paginated %}
<nav>
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">← Назад</a>
{% endif %}
<span>{{ page_obj.number }} / {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Вперёд →</a>
{% endif %}
</nav>
{% endif %}
Пагинация с фильтрами
<!-- Сохраняем GET-параметры при переходе по страницам -->
<a href="?{{ request.GET.urlencode }}&page={{ page_obj.next_page_number }}">Вперёд</a>
Ручная пагинация (в function-based views)
from django.core.paginator import Paginator
def task_list(request):
tasks = Task.objects.all().order_by('-created_at')
paginator = Paginator(tasks, 20)
page_number = request.GET.get('page', 1)
page_obj = paginator.get_page(page_number)
return render(request, 'tasks/list.html', {'page_obj': page_obj})
Переменные контекста ListView
| Переменная | Значение |
|---|---|
page_obj |
текущая страница |
paginator |
объект пагинатора |
is_paginated |
True если страниц > 1 |
object_list |
объекты текущей страницы |
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!