diff --git a/blog/blog/settings.py b/blog/blog/settings.py index 2b4c3b3..4641a48 100644 --- a/blog/blog/settings.py +++ b/blog/blog/settings.py @@ -157,3 +157,7 @@ STATICFILES_DIRS = [ # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" + +# Количество элементов для страницы. +# Используется в постраничной навигации. +ITEMS_PER_PAGE: int = 10 diff --git a/blog/posts/templates/posts/index.html b/blog/posts/templates/posts/index.html index dff0d18..299fc1e 100644 --- a/blog/posts/templates/posts/index.html +++ b/blog/posts/templates/posts/index.html @@ -20,6 +20,76 @@ {% endfor %} {% endif %} -
+
+ + +{% comment %} +Обработка пагинации построена на проверке условий: первые страницы, +последние страницы, страницы в середине большого кол-ва страниц, малое +количество страниц. Для каждого случая - свой код. Также требуются +перменные: current_page (текущая страница) и объект paginator. +{% endcomment %} +
+ +
{% endautoescape %} {% endblock %} diff --git a/blog/posts/urls.py b/blog/posts/urls.py index e9f06ba..d3b4f4b 100644 --- a/blog/posts/urls.py +++ b/blog/posts/urls.py @@ -5,4 +5,5 @@ app_name = "posts" urlpatterns = [ path("", views.index, name="index"), path("/", views.detail, name="detail"), + path("page/", views.index, name="page"), ] diff --git a/blog/posts/views.py b/blog/posts/views.py index 406f9a4..7a2c66c 100644 --- a/blog/posts/views.py +++ b/blog/posts/views.py @@ -3,6 +3,8 @@ from django.http import HttpResponse from django.db.models.query import QuerySet from .models import Post from comments.models import Comment +from django.core.paginator import Paginator +from blog.settings import ITEMS_PER_PAGE from comments import services as comments_services @@ -10,10 +12,25 @@ import re from re import Match -def index(request): +def index(request, page: int = 1): """Список постов.""" - post_list = Post.objects.order_by("-pub_date")[:20] - return render(request, "posts/index.html", {"posts": post_list}) + + post_list = Post.objects.order_by("-pub_date")[:ITEMS_PER_PAGE] + + paginator = Paginator(Post.objects.order_by("-pub_date"), ITEMS_PER_PAGE) + + if page > paginator.num_pages: + page = paginator.num_pages + + if page < 1: + page = 1 + + posts = paginator.get_page(page) + return render( + request, + "posts/index.html", + {"posts": posts, "paginator": paginator, "current_page": page}, + ) def image_processing(match: Match, images: QuerySet) -> str: