При создании комментария на сайте выдаются 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 %}