Ошибка 405 обычно возникает, когда сервер не позволяет выполнять требуемый HTTP-метод (например, POST) для запрашиваемого URL. В вашем случае это может происходить по нескольким причинам. Давайте рассмотрим, как можно добавить и отобразить комментарии на странице поста.
### 1. Обновите ваш `urls.py`
Сначала убедитесь, что у вас есть соответствующий маршрут для обработки POST-запросов в `urls.py`. Если у вас нет такого роута, добавьте его. Например:
```python
from django.urls import path
from .views import Blog, add_comment
urlpatterns = [
path('posts/', Blog.as_view(), name='blog'),
path('posts/<int:post_id>/', BlogDetailView.as_view(), name='post_detail'),
path('posts/<int:post_id>/add_comment/', add_comment, name='add_comment'),
]
```
### 2. Создайте представление для обработки комментариев
Добавьте представление в `views.py`, которое будет обрабатывать POST-запросы для добавления комментариев:
```python
from django.shortcuts import get_object_or_404, redirect
from .models import Post, Comments
from django.http import HttpResponseForbidden
def add_comment(request, post_id):
if request.method == 'POST':
post = get_object_or_404(Post, id=post_id)
name = request.POST.get('name')
text_comments = request.POST.get('text_comments')
if not name or not text_comments:
# Здесь можно добавить обработку ошибок и перенаправление
return HttpResponseForbidden()
comment = Comments(name=name, text_comments=text_comments, post=post)
comment.save()
# Перенаправляем обратно на страницу поста
return redirect('post_detail', post_id=post.id)
# Если это не POST-запрос, возвращаем ошибку 405
return HttpResponseForbidden()
```
### 3. Обновите шаблон для добавления формы комментариев
В вашем HTML-шаблоне для детали поста добавьте форму для отправки комментариев:
```html
<form method="POST" action="{% url 'add_comment' post.id %}">
{% csrf_token %}
<input type="text" name="name" placeholder="Ваше имя" required>
<textarea name="text_comments" placeholder="Ваш комментарий" required></textarea>
<button type="submit">Добавить комментарий</button>
</form>
<!-- Отображение комментариев -->
{% for comment in post.comments_set.all %}
<div>
<strong>{{ comment.name }}</strong>: {{ comment.text_comments }}
</div>
{% endfor %}
```
### 4. Обновите класс представления для отображения поста
Создайте класс представления, который будет отображать как пост, так и его комментарии:
```python
class BlogDetailView(View):
def get(self, request, post_id):
post = get_object_or_404(Post, id=post_id)
comments = post.comments_set.all()
return render(request, 'forum/post_detail.html', {'post': post, 'comments': comments})
```
С помощью этих изменений вы сможете добавлять комментарии через форму на странице поста и отображать их сразу после добавления. Не забудьте убедиться, что шаблон корректно отображает все данные.