Django FormView:form_valid()接受2个位置参数,但给出了3个

Django FormView:form_valid()接受2个位置参数,但给出了3个,django,django-forms,django-views,Django,Django Forms,Django Views,我有以下视图来显示一个页面,您可以在该页面上看到一本书的详细视图,并在下面发表评论/评论: class BookDetailView(DetailView): model = Book def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['form'] = BookReviewForm() return

我有以下视图来显示一个页面,您可以在该页面上看到一本书的详细视图,并在下面发表评论/评论:

class BookDetailView(DetailView):
    model = Book

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = BookReviewForm()
        return context

class BookComment(SingleObjectMixin, FormView):
    template_name = 'book/book_detail.html'
    form_class = BookReviewForm
    model = Book

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponseForbidden()
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse('book_detail', args=[str(self.object.id)])

class BookDetail(View):

    def get(self, request, *args, **kwargs):
        view = BookDetailView.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = BookComment.as_view()
        return view(request, *args, **kwargs)
复习课:

class Review(models.Model):
    book = models.ForeignKey(
        Book,
        on_delete=models.CASCADE,
        related_name='reviews',
    )
    review = models.CharField(max_length=5000)
    score = models.PositiveSmallIntegerField(null=True, blank=True,
                                             validators=[MinValueValidator(0), MaxValueValidator(10)])
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
    )

    class Meta:
        unique_together = ('book', 'author')

    def __str__(self):
        return self.review
表格:

class BookReviewForm(forms.ModelForm):
    class Meta:
        model = Review
        fields = ('review', 'score',)
我想使用表单中提供的信息创建一个新的评论,其中当前登录的用户是
作者
书籍
是我们所处的DetailView中的书籍,但我不知道如何验证和保存

我尝试将此添加到
BookComment
以进行验证:

def form_valid(self, form):
    if form.is_valid():
        return super().form_valid(self, form)
    else:
        return super().form_invalid(self, form)
但是我得到了以下错误:

form_valid()接受2个位置参数,但给出了3个


这3个参数来自何处?我如何才能正确创建新的审阅?

它应该是
return super()。form\u valid(form)
而不使用
self
self
super()
代理对象隐式传递。也就是说,
form\u valid
仅在表单被赋值时调用。谢谢!第二条评论是什么意思?对
form\u valid
的这种重写没有任何作用。通常,创建逻辑是在
form\u valid
中实现的。不过,在这里使用
CreateView
可能更好:这将为您实现大多数“样板”逻辑。