@Ornitier

Ошибка при создании комментария «Method Not Allowed (POST): /book2/», как решить?

При создании комментария на сайте выдаются 3 такие строки:

Method Not Allowed (POST): /book2/
Method Not Allowed: /book2/
[02/Aug/2022 17:27:28] "POST /book2/ HTTP/1.1" 405 0

Думаю ошибка в форме, но не понимаю что именно не так. Пытался сделать action="" но видимо не очень понял что этот элемент в шаблоне формы делает, потому что выдавалась ошибка.
Вот models.py:
from django.db import models
from django.shortcuts import reverse


class Book(models.Model):
    title = models.CharField('Название', max_length = 200)
    author = models.CharField('Автор(ы)', max_length = 300)
    date_create = models.DateField('Дата написания')
    date_edit = models.DateField('Дата издания')
    pages = models.PositiveIntegerField('Кол-во страниц')
    age_limit = models.PositiveBigIntegerField('Возрастное ограницение')
    
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('book_detail', kwargs={'pk': self.pk})

class Comment(models.Model):
    title = models.CharField('Заголовок', max_length=140)
    book = models.ForeignKey(
        Book,
        on_delete=models.CASCADE,
        related_name='books',
    )
    name = models.CharField('Имя', max_length=100, default='Аноним')
    email = models.CharField('Электронная почта', default='Нет', max_length=200)
    body = models.TextField('Комментарий')
    created_date = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Комментарий'
        verbose_name_plural = 'Комментарии'


urls.py:
from django.urls import path

from . import views

urlpatterns = [
    path('', views.BooksView.as_view(), name='home'),
    path('new_book/', views.NewBook.as_view(), name='book_new'),
    path('book<int:pk>/', views.BookDetail.as_view(), name='book_detail'),
    path('update_book/<int:pk>/', views.UpdateBook.as_view(), name='book_update'),
    path('delete_book/<int:pk>/', views.DeleteBook.as_view(), name='book_delete'),
]


views.py:
from django.views.generic import ListView, DetailView, CreateView, UpdateView
from django.views.generic.edit import FormMixin, UpdateView, DeleteView
from django.urls import reverse_lazy
from django.urls import reverse
from . import models, forms

class BooksView(ListView):
    model = models.Book
    template_name = "home.html"

class BookDetail(FormMixin, DetailView):
    model = models.Book
    template_name = "book_detail.html"
    form_class = forms.CommentForm

    def get_success_url(self):
        return reverse('book_detail', kwargs={'pk': self.object.id})
    
    def get_context_data(self, **kwargs):
            context = super(BookDetail, self).get_context_data(**kwargs)
            context['form'] = forms.CommentForm(initial={'book': self.object})
            return context

    def book(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
            
    def form_valid(self, form):
        form.save()
        return super(BookDetail, self).form_valid(form)

class CommentList(ListView):
    model = models.Comment
    template_name = "book_detail.html"

class NewBook(CreateView):
    template_name = 'book_new.html'
    form_class = forms.BookForm
    success_url = '/'

class UpdateBook(UpdateView):
    template_name = 'book_update.html'
    model = models.Book
    fields = '__all__'

class DeleteBook(DeleteView):
    model = models.Book
    success_url = reverse_lazy('home')


И forms.py:
from django.forms import ModelForm
from .models import Comment, Book

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['title', 'name', 'email', 'body']
        
class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = '__all__'


А вот шаблон book_detail.html, мне кажется беда в нём:
{% extends 'base.html' %}
{% block title %}
        <title>{{ book.title }}</title>
{% endblock title %}
{% block content %}
    <div>
        <h2>{{ book.title }}</h2>
        <p>Автор(ы): {{ book.author }}</p>
        <i>Дата написания: {{ book.date_create }}</i>
        <p>Дата издания: {{ book.date_edit }}</p>
        <p>Возрастное ограничение: {{ book.age_limit }}+</p>
        <p>Кол-во страниц: {{ book.pages }} с.</p>
        {% if user.is_authenticated %}
        <a href="{% url 'book_update' book.id %}">Редактировать запись</a>
        {% else %}
            <h2>Вы не администратор данного сайта</h2>
        {% endif %}
    </div>
<br>
    <div>
        <h2>Комментарии:</h2>
        {% if post.comments.all|length > 0 %}
            {% for comment in post.comments.all %}
                <h2>{{ comment.title }}</h2>
                <h3>{{ comment.name }}</h3><i>{{ comment.created_date }}</i>
                <p>{{ comment.body }}</p>
        {% endfor %}
        {% else %}
            <h3>Комментариев нет.</h3>
        {% endif %}
        <br>
            <h3>Добавить комментарий:</h3>
            <form method="POST">
                {% csrf_token %}
                {{ form.as_p }}
                <button type="submit">Добавить комментарий</button>
            </form>
    </div>
{% endblock content %}
  • Вопрос задан
  • 36 просмотров
Решения вопроса 1
@bacon
у BookDetail нет метода post, поэтому он не поддерживает http post, зачем ты переименовал этот метод в book?
Ну и 'book<int:pk>/' так обычно не делают, надо 'book/<int:pk>/'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы