Атрибут object_list
Атрибут object_list класса Page содержит список объектов модели, которые принадлежат текущей странице пагинации. Этот атрибут доступен только для чтения и возвращает список объектов, полученных из QuerySet с учетом ограничений текущей страницы. Атрибут является основным способом доступа к данным на конкретной странице и часто используется в шаблонах для отображения содержимого страницы.
Синтаксис
page.object_list
Пример
Давайте создадим пагинатор для списка статей и получим объекты первой страницы:
from django.core.paginator import Paginator
from myapp.models import Article
# Get all articles
articles = Article.objects.all()
# Create paginator with 10 items per page
paginator = Paginator(articles, 10)
# Get first page
page = paginator.page(1)
# Get objects on this page
page_objects = page.object_list
for article in page_objects:
print(article.title)
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
"article 4"
"article 5"
"article 6"
"article 7"
"article 8"
"article 9"
"article 10"
Пример
Давайте используем атрибут object_list в шаблоне для отображения списка статей:
<!-- in template -->
{% for article in page.object_list %}
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
{% endfor %}
<!-- pagination controls -->
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}">Previous</a>
{% endif %}
Page {{ page.number }} of {{ page.paginator.num_pages }}
{% if page.has_next %}
<a href="?page={{ page.next_page_number }}">Next</a>
{% endif %}
Пример
Давайте проверим количество объектов на последней странице пагинации:
from django.core.paginator import Paginator
from myapp.models import Article
# Get all articles
articles = Article.objects.all()
# Create paginator with 5 items per page
paginator = Paginator(articles, 5)
# Get last page
last_page = paginator.page(paginator.num_pages)
# Get objects count on last page
last_page_count = len(last_page.object_list)
print(last_page_count)
Результат выполнения кода:
"3"
где 3 - количество объектов на последней странице.
Пример
Давайте создадим класс для работы с пагинацией на основе object_list:
from django.core.paginator import Paginator, EmptyPage
from myapp.models import Article
class ArticlePaginator:
def __init__(self, request, queryset, per_page=10):
self.request = request
self.paginator = Paginator(queryset, per_page)
self.page_number = request.GET.get('page', 1)
try:
self.page = self.paginator.page(self.page_number)
except EmptyPage:
self.page = self.paginator.page(self.paginator.num_pages)
def get_articles(self):
return self.page.object_list
def get_pagination_data(self):
return {
'current_page': self.page.number,
'has_next': self.page.has_next(),
'has_previous': self.page.has_previous(),
'total_pages': self.paginator.num_pages,
'items_count': len(self.page.object_list)
}
# Usage example
articles_qs = Article.objects.filter(status='published')
paginator = ArticlePaginator(request, articles_qs, per_page=10)
# Get articles for current page
articles = paginator.get_articles()
# Get pagination data
pagination_data = paginator.get_pagination_data()
print(pagination_data)
Результат выполнения кода:
{"current_page": 1, "has_next": true, "has_previous": false, "total_pages": 5, "items_count": 10}
Смотрите также
-
атрибут
number,
который возвращает номер текущей страницы -
метод
has_next,
который проверяет наличие следующей страницы -
метод
has_previous,
который проверяет наличие предыдущей страницы -
атрибут
paginator,
который возвращает объект пагинатора для текущей страницы