from django.shortcuts import render, get_object_or_404 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 import re from re import Match def index(request, page: int = 1): """Список постов.""" 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: """Заменяет строку с шорткодом [[image:slug]] на валидный HTML тег. Из match берется slug картинки, по которому потом выбираем из images ее url. Если объекта с таким slug нет (IndexError), то заменяем шорткод картинки на пустую строку.""" sl = match.group(1) try: url = images.filter(slug=sl)[0].image.url replacement = f"
" except IndexError: replacement = "" return replacement def detail(request, post_id): """Страница с просмотром поста.""" # вынести отсюда все. Также надо обработать текст поста тут. post = get_object_or_404(Post, pk=post_id) comments = post.comment_set.all() comments_count = comments.count() _nickname = request.COOKIES.get("nickname") nickname = comments_services.decode_nickname(_nickname) if _nickname else "" images = post.image_set.all() # вывод картинок в посте, замена шаблона по регулярке post.text = re.sub( r"\[\[image\:(.+?)\]\]", lambda x: image_processing(x, images), post.text, ) return render( request, "posts/post.html", { "post": post, "comments": comments, "comments_count": comments_count, "nickname": nickname, }, )