You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中CommentPost代码构造疑问:self.object与两次保存原因

Django评论视图代码疑问解答

我是Django初学者,正在阅读WS Vincent的《Django for Beginners》倒数第二章。书中给出如下代码,实现了无需混合FormMixin与自定义ArticleDetailView、可处理GET和POST请求的评论视图。我理解整体逻辑,但不清楚代码为何如此构造,想请教:示例中self.object和self.get_object是什么?form_valid方法中为何要保存两次?

def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

def form_valid(self, form):
    comment = form.save(commit=False)
    comment.article = self.object
    comment.save()
    return super().form_valid(form)

def get_success_url(self):
    article = self.get_object()
    return reverse("article_detail", kwargs={"pk": article.pk})  

1. self.object 和 self.get_object() 是什么?

  • self.get_object() 是Django通用视图(比如你用的ArticleDetailView)自带的方法,它会根据URL里的主键(pk)参数,自动从数据库中取出对应的Article实例。每次调用这个方法,都会重新查询数据库获取最新数据。
  • self.object 是通用视图类里用来存储当前模型实例的属性。在GET请求时,通用视图会自动调用get_object()并把结果赋值给self.object,但POST请求时默认不会做这一步。所以代码里的post方法手动把self.get_object()的结果赋值给self.object,这样后续的form_valid方法就能直接用这个已经查询好的文章对象,不用重复查库。

2. form_valid方法中为什么要保存两次?

  • 第一次调用 form.save(commit=False):这是告诉Django,根据表单提交的数据创建一个Comment对象,但暂时不要把它写入数据库。因为评论表单里通常不会让用户选择关联的文章(是自动关联当前打开的文章),所以这个时候的Comment实例缺少article外键的值,必须手动补充。
  • 第二次调用 comment.save():给Comment实例补上article = self.object之后,调用这个方法才把完整的评论数据真正保存到数据库里。
  • 最后调用 super().form_valid(form):这一步主要是为了遵循通用视图的流程,让视图继续执行后续的逻辑(比如跳转到成功页面)。实际上我们已经手动保存过评论了,这一步不会再重复保存数据。

内容的提问来源于stack exchange,提问作者Victor Calimano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:55:16