Comment() 得到了一个意外的关键字参数 'initial'
Comment() got an unexpected keyword argument 'initial'
我正在创建 Django 博客,在尝试实现评论系统时遇到了上述错误。我不太确定是什么导致了这些问题,但我将描述我在收到错误之前所做的一些事情。
我决定使用 Django 基于 class 的视图来显示我的所有数据。在所示的 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)
这是表单页面
forms.py
from django import forms
from .models import Comment
class CommentForms(forms.ModelForm):
class Meta:
model = Comment
fields = ('name', 'email', 'body')
这是关联模型
models.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
post-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)
我正在创建 Django 博客,在尝试实现评论系统时遇到了上述错误。我不太确定是什么导致了这些问题,但我将描述我在收到错误之前所做的一些事情。
我决定使用 Django 基于 class 的视图来显示我的所有数据。在所示的 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)
这是表单页面
forms.py
from django import forms
from .models import Comment
class CommentForms(forms.ModelForm):
class Meta:
model = Comment
fields = ('name', 'email', 'body')
这是关联模型
models.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
post-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)