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)