Задать вопрос

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

При запуске сайта комментарии добавляются и выводятся под постами только через админ панель, при попытке добавить комментарии через форму на сайте вылетает ошибка 405. Как сделать так что бы при добавлении комментария через форму комментарий добавлялся и я оставался на этой же странице по пути localhost/posts/айди поста/?
PS. Скорее всего это из-за одинаковых маршрутов в файле urls.py, я не понимаю как это исправить...

файл приложения models.py

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}'


Файл приложения views.py

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 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():
                form = form.save(commit=False)
                form.post_id = post_id
                form.save()
            return redirect(f'posts/{post_id}')


Файл приложения urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.Home.as_view(), name='home'),  # Главная страница
    path('posts', views.Blog.as_view(), name='posts'), # Страница блога
    path('posts/<int:post_id>/', views.PostDetail.as_view(), name='post_detail'), # Страница поста
    path('posts/<int:post_id>/', views.AddComments.as_view(), name='add_comments'),
    path('help', views.Help.as_view(), name='help'), # Страница помощи
]


файл post_detail.html

<div>
        <form action="{% url 'add_comments' post.id %}" method="post">
            <h3></h3>
            {% csrf_token %}
            <div>
                <textarea name="text_comments" placeholder="Ваш комментарий..."></textarea>
            </div>
            <div>
                <input type="text" name="name" placeholder="Ваше имя *">
            </div>
            <div><input type="submit"></div>
        </form>
    </div>
    <div>
        {% for comment in post.comments_set.all reversed %}
            <div class="view-comment">
                <h4>{{ comment.name }}</h4>
                <p>{{ comment.text_comments }}</p>
            </div>
        {% endfor %}
    </div>
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Lord_of_Rings
@Lord_of_Rings
Дунадан - северный странник. Злой, но очень добрый
В 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)

Так должно всё работать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы