from django.shortcuts import render from django.core.paginator import Paginator from django.core.cache import cache from .models import manga_collection import hashlib 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") # Получаем выбранные теги selected_tags = request.GET.getlist('tags') query = {} query_key = hashlib.md5(str(query).encode()).hexdigest() cache_key = f"count_{query_key}" total_filtered = cache.get(cache_key) if total_filtered is None: total_filtered = manga_collection.count_documents(query) cache.set(cache_key, total_filtered, 60) # на 1 минуту """ query = {} if selected_tags: query['tags'] = {'$all': selected_tags} # Считаем количество для пагинации (можно тоже кешировать по хешу, но пока так) total_filtered = manga_collection.count_documents(query)""" # Получаем номер страницы 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) # Передаём данные в шаблон return render(request, 'manga_catalog.html', { 'page_obj': page_obj, 'manga_list': manga_list, 'total_manga_count': total_manga_count, 'all_tags': sorted(all_tags), 'selected_tags': selected_tags, }) def show_manga(request, manga_id): manga = manga_collection.find_one({"id": int(manga_id)}) if not manga: return render(request, "not_found.html") return render(request, "manga_view.html", {"manga": manga}) def show_manga_page(request, manga_id, page_number): manga = manga_collection.find_one({"id": int(manga_id)}) if not manga or page_number < 1 or page_number > manga['len_manga']: return render(request, "not_found.html") img_url = manga['imgs_manga'][page_number - 1] return render(request, "manga_page.html", { "manga": manga, "img_url": img_url, "page_number": page_number })