From 1dff9fbffb9f2bbc0ecf67522cd968a9907d6c6d Mon Sep 17 00:00:00 2001 From: zein Date: Mon, 3 Nov 2025 07:57:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hentai_manga_model/models.py | 1 - Hentai_manga_model/views.py | 43 +++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Hentai_manga_model/models.py b/Hentai_manga_model/models.py index 561d3a5..2427e60 100644 --- a/Hentai_manga_model/models.py +++ b/Hentai_manga_model/models.py @@ -1,4 +1,3 @@ -# db.py import os from pymongo import MongoClient diff --git a/Hentai_manga_model/views.py b/Hentai_manga_model/views.py index 6736951..9cbcfa1 100644 --- a/Hentai_manga_model/views.py +++ b/Hentai_manga_model/views.py @@ -1,36 +1,53 @@ from django.shortcuts import render from django.core.paginator import Paginator +from django.core.cache import cache from .models import manga_collection def manga_catalog(request): - # Получаем список всех уникальных тегов + # Кешируем общее количество (раз в 5 минут) + total_manga_count = cache.get('total_manga_count') + if total_manga_count is None: + total_manga_count = manga_collection.estimated_document_count() + cache.set('total_manga_count', total_manga_count, 300) + + # Все теги — можно тоже кешировать, но пока оставим all_tags = manga_collection.distinct("tags") - # Получаем выбранные теги из GET-параметров + # Получаем выбранные теги selected_tags = request.GET.getlist('tags') - - # Формируем запрос для фильтрации query = {} if selected_tags: query['tags'] = {'$all': selected_tags} - # Получаем отфильтрованные записи - filtered_manga = list(manga_collection.find(query)) + # Считаем количество для пагинации (можно тоже кешировать по хешу, но пока так) + total_filtered = manga_collection.count_documents(query) - # Пагинация - paginator = Paginator(filtered_manga, 20) - page_number = request.GET.get('page') + # Получаем номер страницы + page_number = request.GET.get('page') or 1 + try: + page_number = int(page_number) + except (TypeError, ValueError): + page_number = 1 + + per_page = 20 + skip = (page_number - 1) * per_page + + # Получаем только текущую страницу + manga_cursor = manga_collection.find(query).skip(skip).limit(per_page) + manga_list = list(manga_cursor) + + # Создаём Paginator и page_obj ПРАВИЛЬНО + paginator = Paginator(range(total_filtered), per_page) page_obj = paginator.get_page(page_number) - total_manga_count = manga_collection.count_documents({}) - + # Передаём данные в шаблон return render(request, 'manga_catalog.html', { 'page_obj': page_obj, - 'manga_list': page_obj.object_list, + 'manga_list': manga_list, 'total_manga_count': total_manga_count, 'all_tags': sorted(all_tags), - 'selected_tags': selected_tags + 'selected_tags': selected_tags, }) def show_manga(request, manga_id):