Я создаю блог Django, и при попытке реализовать систему комментариев я получил указанную выше ошибку. Я не совсем уверен, что вызвало проблемы, но я опишу некоторые вещи, которые я сделал, прежде чем я получил ошибку.
Я решил использовать представления Django на основе классов для отображения всех своих данных. В показанном PostDetailView я попытался сделать так, чтобы он наследовал как от DetailView, так и от FormView, чтобы я отображал как детали, так и форму.
Закомментированный код — это код, который я собирался использовать для представления формы, но я не знал, как заставить его использовать тот же шаблон и маршрут URL.
Views.py
from django.views.generic import DetailView, FormView
from .forms import Comment
from .models import Post
class PostDetailView(DetailView, FormView):
model = Post
template_name= 'optionhouseapp/post-detail.html'
form_class = Comment
def form_valid(self, form):
return super().form_valid(form)
# class CommentFormView(FormView):
# template_name= 'optionhouseapp/post-detail.html'
# form_class = Comment
# success_url ='/'
# def form_valid(self, form):
# return super().form_valid(form)
Вот страница формы
формы.py
from django import forms
from .models import Comment
class CommentForms(forms.ModelForm):
class Meta:
model = Comment
fields = ('name', 'email', 'body')
Вот связанная модель
модели.py
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
name = models.CharField(max_length=80)
email = models.EmailField()
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
active = models.BooleanField(default=False)
class Meta:
ordering = ['created_on']
def __str__(self):
return "Comment {} by {}".format(self.body, self.name)
Вот URL-адреса
urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.IndexListView.as_view(), name='index'),
path('postlist/', views.PostListView.as_view(), name='post-list' ),
path('about/', views.about, name='about'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post-detail'),
path('post-create', views.CreatePostView.as_view(), name='post_form'),
path('post/<int:pk>/update', views.UpdatePostView.as_view(), name='post-update' ),
path('post/<int:pk>/delete', views.DeletePostView.as_view(), name='post-delete')
]
Вот HTML, который я пытаюсь отобразить
пост-detail.html
{%extends 'optionhouseapp/base.html'%}
{% load crispy_forms_tags %}
{%block content%}
<div class='container'>
{{object.image}} <br>
{{object.title}} <br>
{{object.author}} <br>
{{object.date}} <br>
{{object.content}} <br>
</div>
<div class='container'>
{% if user.is_authenticated and user == object.author %}
<a href = "{% url 'post-update' post.id %}">Update</a>
<a href = "{% url 'post-delete' post.id %}">Delete</a>
{% endif %}
</div>
<div class = "container">
<form method = "POST">
{% csrf_token %}
<legend></legend>
{{form | crispy}}
<input type = "submit" value = "Submit">
</form>
</div>
{%endblock content%}
Вот ошибка, которую я получаю
Traceback (most recent call last):
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/detail.py", line 107, in get
context = self.get_context_data(object=self.object)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/detail.py", line 100, in get_context_data
return super().get_context_data(**context)
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 66, in get_context_data
kwargs['form'] = self.get_form()
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 33, in get_form
return form_class(**self.get_form_kwargs())
File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/db/models/base.py", line 501, in __init__
raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Comment() got an unexpected keyword argument 'initial'
[26/Dec/2020 04:51:31] "GET /post/6/ HTTP/1.1" 500 89557
Пожалуйста, любая помощь, которую я могу получить, будет по-настоящему оценена.






Вы определили свою форму как CommentForm, но в DetailView вы используете form_class = Comment.
Вы импортируете .forms import Comment, вместо этого вы должны использовать
.forms import CommentForm
....
...
form_class = CommentForm
Представления на основе классов могут быть сложными при использовании форм, я бы предложил использовать представления на основе функций при работе с формами и другими сложными вещами.
from .forms import CommentForm
from .models import Post
def PostDetailView(request, slug):
form = CommentForm()
post = Post.objects.filter(slug=slug).first()
comments = post.comments.all()
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
form = CommentForm()
context = {'post':post,'form':form,'comments':comments}
return redirect('post-detail',slug=post.slug)
context = {'post':post,'form':form,'comments':comments}
return render(request,'blog/post_detail.html', context)
Большое спасибо. Вы были правы насчет моей ошибки. Я ценю помощь