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: