POST /post/29/ HTTP/1.1" 405 0

Хочу добавить комментарии к посту в моем блоге на Django, но когда я жму отправить, то появляется эта ошибка POST /post/29/ HTTP/1.1" 405 0

models.py

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType




class Post(models.Model):
    published = None
    title = models.CharField(max_length=200)
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE,
    )
    body = models.TextField()
    header_image = models.ImageField(blank=True, null=True, upload_to="images/")


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', args=[str(self.id)])


class Comment(models.Model):
    post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
    name = models.CharField(max_length=255, default="Some String")
    body = models.TextField(max_length=255, null=True, blank=True)
    #date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s - %s' % (self.post.title, self.name)

forms.py

from django.forms import ModelForm

from .models import Comment


class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'body']

views.py

from django.shortcuts import render, redirect
from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .forms import CommentForm
from .models import Post


class BlogListView(ListView):
    model = Post
    template_name = 'home.html'

    context_object_name = 'posts'
    paginate_by = 2
    queryset = Post.objects.all()

    #paginate_by = 2
    #model = Contact

class BlogDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'

class BlogCreateView(CreateView):
    model = Post
    template_name = 'post_new.html'
    fields = ['title', 'author', 'body', 'header_image']

class BlogUpdateView(UpdateView):
    model = Post
    template_name = 'post_edit.html'
    fields = ['title', 'body', 'header_image']

class BlogDeleteView(DeleteView):
    model = Post
    template_name = 'post_delete.html'
    success_url = reverse_lazy('home')

@property
def image_url(self):
    """
    Return self.photo.url if self.photo is not None,
    'url' exist and has a value, else, return None.
    """
    if self.image:
        return getattr(self.photo, 'url', None)
    return None

def detail(request, slug):
    post = Post.objects.get(slug=slug)

    if request.method == 'POST':
        form = CommentForm(request.POST or None)

        if form.is_valid():
            obj = form.save(commit=False)
            obj.post = post
            obj.save()

            return redirect('detail', slug=post.slug)
    else:
        form = CommentForm()

    context = {
        'post': post,
        'form': form
    }

    return render(request, 'post_delete.html', context)

myblog/urls.py

    from django.urls import path

from .views import (
    BlogListView,
    BlogDetailView,
    BlogCreateView,
    BlogUpdateView,
    BlogDeleteView,
    comment_detail
)

urlpatterns = [
    path('post/new/', BlogCreateView.as_view(), name='post_new'),
    path('post/<int:pk>/', BlogDetailView.as_view(), name='post_detail'),
    path('post/<int:pk>/edit/', BlogUpdateView.as_view(), name='post_edit'),
    path('post/<int:pk>/delete/', BlogDeleteView.as_view(), name='post_delete'),
    path('post/<int:slug>/comments', comment_detail, name='comments'),
    path('', BlogListView.as_view(), name='home'),

]

blog/urls.py

    from django.contrib import admin
from django.urls import path, include

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    path('accounts/', include('accounts.urls')),
    path('', include('myblog.urls')),
    path('comment/', include('comment.urls')),
    path('api/', include('comment.api.urls'))

]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

post_detail.html

{% extends 'base.html' %}

{% block content %}
    <div class="post-entry">
        <h2>{{ post.title }}</h2>
        <p>{{ post.body|urlize }}</p>
    </div>

    <p><a href="{% url 'post_edit' post.pk %}">+ Edit Blog Post</a></p>
    <p><a href="{% url 'post_delete' post.pk %}">+ Delete Blog Post</a></p>
    {% if post.header_image %}
        <p><img src="{{post.header_image.url}}"></p>
    {% else %}
        <p></p>
    {% endif %}


    {% for comm in post.commentpost_set.all%}
        {{ comm.user }} <br>
        {{ comm.text }} <br><br>
    {% endfor %}

    <article class="content" >

        <br><hr>
        <h2>Add a comment</h2>

        <form method="post" action='{% url 'comments' %}'>
            {% csrf_token %}


            {{ form.as_table }}
            <p>Name: </p>
            <input name="Name" type="text">
            <p>Body: </p><textarea></textarea><br><br>

            <input type="submit" value="Submit">
        </form>
    </article>

{% endblock content %}

Я не так давно начал изучать Django, поэтому извините за бардак в коде. Буду благодарен даже за маленький совет, спасибо


Ответы (1 шт):

Автор решения: Миша

Возможно у формы, где создаются комментарии нету action. Укажите action. Туда вы должны поместить имя url-a, к которому присвоена view для создания комментов.

Примерно так:

path('articles/<int:id>/comments',comment_create,name='comments')

def comment_create(request):
    #сама логика                                                               
    return render(request,'template.html')

И в шаблоне template.html:

<form method="POST" action='{% url 'comments' %}'>
...
</form>

Или же вы не указали метод у формы. Ну в данном случае у вас создание комментов и нужно поставить method="POST" в теге form

→ Ссылка