Django类视图success_url如何引用模型get_absolute_url方法
Django基于类视图中通过模型get_absolute_url配置跳转地址的实现方法
不要直接在类属性success_url的定义位置调用模型的get_absolute_url方法:success_url是类加载阶段就会初始化的静态属性,此时视图还未查询到本次要操作的Comment实例,既没有实例传入作为方法的self参数,也无法获取评论关联的post.slug数据,直接调用会抛出参数错误或生成错误的跳转路径。
正确实现方式是重写视图类的get_success_url()方法,该方法会在删除操作执行完成、对应模型实例加载到内存后才触发,此时可以通过self.object拿到当前操作的评论实例,直接调用实例上的get_absolute_url()方法即可拿到目标跳转地址。
注意:删除操作执行后,数据库中的Comment记录会被移除,但内存中
self.object指向的实例数据会暂时保留,完全可以正常读取关联的post字段生成跳转路径,不会出现查询不到数据的问题。
修改后的DeleteCommentView代码如下:
class DeleteCommentView(DeleteView): model = Comment template_name = "delete_comment.html" def get_success_url(self): return self.object.get_absolute_url()
补充说明:Django内置的CreateView、UpdateView、DeleteView等编辑类视图,默认的get_success_url逻辑本身就会优先读取模型实例的get_absolute_url返回值,如果没有特殊跳转规则,甚至可以省略success_url配置、也不重写方法,框架会自动调用该方法获取跳转地址。但显式重写get_success_url的写法兼容性最好,不会因为Django版本差异出现异常。
内容的提问来源于stack exchange,提问作者Ekansh Virmani
相关产品推荐
相关产品推荐

