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
可能更好:这将为您实现大多数“样板”逻辑。