Часто требуется ограничить количество записей, выводимых на страницу.
Для этого используется постраничное разделение материала - пагинация (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)
Внешний вид пагинации:

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