You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
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 <img/> тег. |
|
Из match берется slug картинки, по которому потом выбираем из |
|
images ее url. Если объекта с таким slug нет (IndexError), то заменяем шорткод |
|
картинки на пустую строку.""" |
|
sl = match.group(1) |
|
try: |
|
url = images.filter(slug=sl)[0].image.url |
|
replacement = f"<figure class='image'><img src='{url}'/></figure>" |
|
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, |
|
}, |
|
)
|
|
|