При запуске сайта комментарии добавляются и отображаются под постами только через админ-панель. Когда я пытаюсь добавить комментарии через форму на сайте, возникает ошибка 405. Как я могу сделать так, чтобы комментарий добавлялся через форму и я оставался на той же странице по адресу <b>localhost/posts/айди поста/</b>? <br/> PS. Я предполагаю, что проблема может быть связана с одинаковыми маршрутами в файле <b>urls.py</b>, и не знаю, как это исправить... <br/><br/> Вот файл приложения <b>models.py</b>: <br/><br/><pre><code class="python">class Post(models.Model):
title = models.CharField('Заголовок записи', max_length=50)
description = models.TextField('Текст записи', max_length=5000)
date_add = models.DateTimeField('Дата публикации', auto_now=True)
def __str__(self):
return f'{self.date_add} / {self.title}'
class Comments(models.Model):
name = models.CharField('Имя', max_length=16)
text_comments = models.TextField('Текст комментария', max_length=200)
post = models.ForeignKey(Post, verbose_name='Публикация', on_delete=models.CASCADE)
def __str__(self):
return f'{self.name} / {self.post}'</code></pre> <br/><br/> Вот файл приложения <b>views.py</b>: <br/><br/><pre><code class="python">class Home(View):
def get(self, request):
post_title = Post.objects.all()
return render(request, 'forum/home.html', {'post_title': post_title}) # Функция возвращающая HTML страницу
class Blog(View):
def get(self, request):
post = Post.objects.all()
print(post)
return render(request, 'forum/blog.html', {'post': post})
class</code></pre>
Ошибка 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})
```
С помощью этих изменений вы сможете добавлять комментарии через форму на странице поста и отображать их сразу после добавления. Не забудьте убедиться, что шаблон корректно отображает все данные.
В urls.py для комментариев измените наpath('posts/<int:post_id>/add_comment/', views.AddComments.as_view(), name='add_comments'),
В views.pyclass Home(View): def get(self, request): post_title = Post.objects.all() return render(request, 'forum/home.html', {'post_title': post_title}) class Blog(View): def get(self, request): post = Post.objects.all() print(post) return render(request, 'forum/blog.html', {'post': post}) class PostDetail(View): def get(self, request, post_id): post = Post.objects.get(id=post_id) return render(request, 'forum/post_detail.html', {'post': post}) class AddComments(View): def post(self, request, post_id): form = CommentsForm(request.POST) if form.is_valid(): comment = form.save(commit=False) comment.post_id = post_id comment.save() return redirect('post_detail', post_id=post_id)
Так должно всё работать