Django使用Generic DeleteView时表单返回DeferredAttribute对象如何解决
问题根源
你在DeleteNoteView的get_context_data方法中,为表单传入的instance参数是self.model,也就是Note模型类本身,而非当前请求要删除的具体Note实例。直接访问模型类的字段属性就会返回你看到的DeferredAttribute对象,而不是实例存储的实际数据。
你写的函数视图中,DeleteNoteForm(instance=note)传入的是通过pk查询到的具体Note实例,所以可以正常渲染数据,类视图写法就是这里传错了参数。
修复方案
修改views.py中DeleteNoteView的get_context_data方法,将instance参数替换为类视图已经自动查询好的当前实例self.object即可,修改后代码如下:
class DeleteNoteView(DeleteView): model = Note template_name = 'note-delete.html' form_class = DeleteNoteForm success_url = reverse_lazy('home page') def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) # 替换 self.model 为 self.object,self.object是当前要删除的具体Note实例 data['form'] = self.form_class(instance=self.object) return data
补充说明
Django的SingleObjectMixin(DeleteView的父类之一)会自动根据url传入的pk参数查询对应实例,在执行get_context_data之前就已经将实例赋值给了self.object属性,可以直接使用。
内容的提问来源于stack exchange,提问作者peperone
相关产品推荐
相关产品推荐

