понедельник, 26 мая 2014 г.

Пагинация страниц в Django

Часто требуется ограничить количество записей, выводимых на страницу. Для этого используется постраничное разделение материала - пагинация (pagination). В этом уроке мы рассмотрим реализацию пагинации стандартными средствами Django.


1. Пусть у нас есть представление, используемое для вывода списка статей. Применим к нему пагинацию:
# ...
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

class ArticleListView(ListView):
    context_object_name = 'articles'
    template_name = 'articles/article_list.html'

    def get_queryset(self):
        articles = Article.objects.all()
        # Отбираем первые 10 статей
        paginator = Paginator(articles, 10)
        page = self.request.GET.get('page')
        try:
            articles = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer, deliver first page.
            articles = paginator.page(1)
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of results.
            articles = paginator.page(paginator.num_pages)
        return articles

2. Если теперь передать в качестве GET-параметра page=2 (http://127.0.0.1:8000/blog/?page=2), то мы увидим список статей с 11 по 20 включительно.

3. Теперь нужно в шаблоне сформировать меню управления пагинацией.

<div class="pagination">

    {% if articles.has_previous %}
        <a href="?page={{ articles.previous_page_number }}">←</a>
    {% endif %}

    {% for num in articles.paginator.page_range %}
        {% if num == articles.number %}
            <span class="current"><b>{{ num }}</b></span>
        {% else %}
            <a href="?page={{ num }}"> {{ num }}</a>
        {% endif %} 
    {% endfor %}

    {% if article_list.has_next %}
        <a href="?page={{ article_list.next_page_number }}">→</a>
    {% endif %}

</div>

Обратите внимание, мы в представлении ArticleListView передаем в шаблон переменную articles (context_object_name = 'articles'). И мы через эту переменную можем обращаться к пагинатору Django:
articles.paginator.page_range - генератор доступных номеров страниц

4. После этого статьи будут выводиться на экран постранично. Номера страниц передаются в GET-параметре, к примеру: http://127.0.0.1:8000/blog/?page=3
На страницу выводится в нашем случае 10 статей, т.к. мы задали в представлении:
# ...
paginator = Paginator(articles, 10)

Внешний вид пагинации:


Комментариев нет:

Отправить комментарий