Добавление представления для комментариев
Для обработки добавления комментариев создадим представление (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), и выводит имя и текст каждого.
Реализована функциональность добавления и отображения комментариев: обработка формы, валидация данных, сохранение в базу данных и вывод на странице поста.