django: DetailView: self.object 从方法 post 调用时会引发错误,但从方法 get_context_data 调用时它确实有效

Posted

技术标签:

【中文标题】django: DetailView: self.object 从方法 post 调用时会引发错误,但从方法 get_context_data 调用时它确实有效【英文标题】:django: DetailView: self.object raises an error when called from the method post, but it does work when called from the method get_context_data 【发布时间】:2013-10-12 09:52:36 【问题描述】:

我创建了一个继承自DetailView 的类,并覆盖了get_context_datapost 方法。标题中提到的看起来很奇怪的是,我可以从get_context_data 调用self.object,但我不能从帖子中调用,所以我不得不改用self.get_object()。但我想明白为什么? self.objectget_context_data 删除了吗?这样在它之后调用的任何方法都不能使用它或类似的东西?

提前致谢

【问题讨论】:

【参考方案1】:

post 方法在DetailView 中默认不存在,您实际上创建它并没有覆盖,因此您需要自己获取对象,它在get_context_data 中可用的原因是它已经在get 方法中获取并保存在object 属性中。

【讨论】:

但是如果已经创建了对象,为什么它不能用于我的新方法帖子?我的意思是 get_context_data 显然首先被调用,然后 self.object 被创建并保存,所以从逻辑上讲,它应该可用于在 get_context_data 之后调用的任何方法到我的类的实例中,除非方法 post 被调用到另一个实例中,或者self.object 之前被清除了..我说的有道理吗? @smarber No no.. 如果你查看 DetailView 源代码,get_context_data 实际上是在对象创建后在get 方法内部调用的(也在get 内部)。所以你需要做同样的事情,当你决定创建自己的方法(post、put、delete等)时,你需要自己抓取对象。你看过 ccbv.co.uk 参考资料吗?

以上是关于django: DetailView: self.object 从方法 post 调用时会引发错误,但从方法 get_context_data 调用时它确实有效的主要内容,如果未能解决你的问题,请参考以下文章

Django中的DetailView,关键字'slug'

Django - 使用 DetailView 创建视图

Django:在通用 DetailView 中实现表单

Django 通用视图:何时使用 ListView 与 DetailView

Django DetailView 动态模型

Django 用主键找不到我的 DetailView