Часто требуется ограничить количество записей, выводимых на страницу.
Для этого используется постраничное разделение материала - пагинация (pagination).
В этом уроке мы рассмотрим реализацию пагинации стандартными средствами Django.
1. Пусть у нас есть представление, используемое для вывода списка статей. Применим к нему пагинацию:
2. Если теперь передать в качестве GET-параметра page=2 (http://127.0.0.1:8000/blog/?page=2), то мы увидим список статей с 11 по 20 включительно.
3. Теперь нужно в шаблоне сформировать меню управления пагинацией.
Обратите внимание, мы в представлении ArticleListView передаем в шаблон переменную articles (context_object_name = 'articles'). И мы через эту переменную можем обращаться к пагинатору Django:
articles.paginator.page_range - генератор доступных номеров страниц
4. После этого статьи будут выводиться на экран постранично. Номера страниц передаются в GET-параметре, к примеру: http://127.0.0.1:8000/blog/?page=3
На страницу выводится в нашем случае 10 статей, т.к. мы задали в представлении:
Внешний вид пагинации:
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)
Внешний вид пагинации:
Комментариев нет:
Отправить комментарий