Почему комментарии в Django можно добавлять и отображать на странице только через административную панель?

При запуске сайта комментарии добавляются и отображаются под постами только через админ-панель. Когда я пытаюсь добавить комментарии через форму на сайте, возникает ошибка 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>
  • 18 декабря 2024 г. 12:53
Ответы на вопрос 2
Ошибка 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.py
class 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)

Так должно всё работать
Похожие вопросы