Django 4: Мини-блог, добавление комментариев

Добавление представления для комментариев

Для обработки добавления комментариев создадим представление (view) CommentsView в файле views.py, наследующее от django.views.generic.View:

from django.shortcuts import redirect
from django.views.generic import View

class CommentsView(View):
    """Добавление комментариев."""

    def post(self, request, pk):
        print(request.POST)  # Временная реализация, для демонстрации
        return redirect('/')

Метод post принимает POST-запрос и ID записи (pk). Временная реализация выводит данные запроса в консоль и перенаправляет на главную страницу.

Добавление URL для комментариев

В файле urls.py добавим URL-паттерн:

path('review/<int:pk>/', CommentsView.as_view(), name='add_comment'),

Этот путь принимает ID записи (pk) и вызывает представление CommentsView. Атрибут name позволяет обращаться к этому URL в шаблонах.

Защита от подделки межсайтовых запросов (CSRF)

Для защиты от CSRF, в HTML-шаблоне формы добавим токен CSRF:

{% csrf_token %}

и укажем URL действия формы:

<form action="{% url 'add_comment' post.id %}" method="post">

{% url ‘add_comment’ post.id %} генерирует URL, передавая ID поста.

Обработка и сохранение данных формы

Создадим форму в forms.py:

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'text')

CommentForm наследуется от forms.ModelForm, связывая модель Comment с полями формы.

В представлении CommentsView, импортируем форму и используем её для валидации и сохранения данных:

from .forms import CommentForm

# ... внутри метода post ...

form = CommentForm(request.POST)
if form.is_valid():
    comment = form.save(commit=False)
    comment.post_id = pk
    comment.save()
    return redirect('post_detail', pk=pk)

form.is_valid() проверяет валидность данных. form.save(commit=False) создаёт объект комментария, мы устанавливаем post_id и сохраняем. Перенаправление осуществляется на страницу с детальной информацией о посте, используя ID поста.

Вывод комментариев в шаблоне

В шаблоне post_detail.html выведем комментарии:

<div class="comments">
    {% for comment in post.comment_set.all %}
        <div class="comment">
            <h4>{{ comment.name }}</h4>
            <p>{{ comment.text }}</p>
        </div>
    {% endfor %}
</div>

Код перебирает комментарии, связанные с постом (post.comment_set.all), и выводит имя и текст каждого.

Реализована функциональность добавления и отображения комментариев: обработка формы, валидация данных, сохранение в базу данных и вывод на странице поста.

Что будем искать? Например,программа