Постраничная навигация в ListView

категория: Django
Количество материала, статей блога, работ или новостей все время растет и они нагромождаются на странице. Я сейчас писал страницу с отображением работ копирайтера, их естественно будет много и нужно их как-то скрывать, не все же выводить на одной странице. К примеру, можно вывести только 7 работ, а остальные скрыть с помощью фильтра:
#works/views.py
from django.views.generic import ListView
from works.models import Works
#Список всех работ
class WorksListView(ListView):
    #Выбираем только 7 работ из базы
    queryset = Works.objects.all().order_by('-created')[:7]
    template_name = 'works/works.html'
Но это не вариант, нужно вывести все работы, просто разделить их на несколько страниц. В этом поможет постраничная навигация - pagination. Используя Class-based generic views - работать с постраничной навигацией совсем не трудно:
#works/views.py
from django.views.generic import ListView
from works.models import Works
#Список всех работ
class WorksListView(ListView):
    queryset = Works.objects.all().order_by('-created')
    template_name = 'works/works.html'
    #Выбираем 7 объектов для вывода
    paginate_by = 7
В шаблонах просто пользуемся django.core.paginator. У меня вышло примерно так:
{% block content %}
  Мои работы:
  <!--Вывод работ-->
  {% for work in object_list %}
    {{ work.title }}
    {{ work.created }}
    {{ work.description|safe }}
  {% endfor %}
  <!--Если нужна постраничная навигация-->
  {% if  is_paginated %}
    <!--Если есть предыдущая страница - то делаю ссылку "назад"-->
    {% if  page_obj.has_previous %}
      <a href="?page={{ page_obj.previous_page_number }}">назад</a> |
    {% endif %}
    <!--Выводим текущую страницу из всех возможных-->
    страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}
    <!--Если есть следующая страница - то ссылка "вперед"-->
    {% if  page_obj.has_next %}| 
      <a href="?page={{ page_obj.next_page_number }}">вперед</a>
    {% endif %}
  {% endif %}
{% endblock content %}
Ко всему этому добавляем стили - и все очень симпатично и удобно.


blog comments powered by Disqus