问题描述
我正在尝试使用 Django 为我的应用程序的博客部分创建评论系统。我试图将我的详细信息视图与表单 mixin 混合在一起,但我有点挣扎。提交表单时,它不会保存,也不会出现错误。如果你们中有人能提供帮助,我将不胜感激。
这是我的观点
class DetailPostView(FormMixin,DetailView):
model = Post
template_name = "blog/post_detail.html"
context_object_name = "posts"
form_class = CommentForm
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context["form"] = CommentForm
return context
def post(self,request,*args,**kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
return reverse("post-detail",kwargs={"pk": self.object.pk})
模型
class Comment(models.Model):
comment = models.ForeignKey(Post,on_delete=models.CASCADE)
title = models.CharField(max_length=200)
content = models.TextField()
author = models.CharField(max_length=50)
created_on = models.DateTimeField(auto_Now_add=True)
class Meta:
ordering = ["-created_on"]
def __str__(self):
return self.title
解决方法
发生这种情况的原因是因为您构建了一个传递给上下文数据的新表单,因此它不会呈现任何错误,因为您构建了一个表单没有验证请求数据并呈现该表单,因此您不会首先显示拒绝数据的表单。
但是您不需要这样做。 Django 的 FormMixin
[Django-doc] 已经解决了这个问题。因此,您不应覆盖 .get_context_data(…)
method [Django-doc]。
另一个问题是您没有保存表单,您可以覆盖 form_valid
方法,或者您可以从 ModelFormMixin
[Django-doc] 继承。
最后你最好先创建表单,然后赋值self.object
,否则它会将此作为实例传递给表单:
from django.views.generic.edit import ModelFormMixin
class DetailPostView(ModelFormMixin,DetailView):
model = Post
template_name = 'blog/post_detail.html'
context_object_name = 'posts'
form_class = CommentForm
# no get_context_data override
def post(self,request,*args,**kwargs):
# first construct the form to avoid using it as instance
form = self.get_form()
self.object = self.get_object()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
return reverse('post-detail',kwargs={'pk': self.object.pk})