Files
hentai_manga_site/Hentai_manga_model/views.py
2025-11-03 07:57:31 +03:00

70 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")
# Получаем выбранные теги
selected_tags = request.GET.getlist('tags')
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
})