89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
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
|
||
})
|