已注释DetailView的get_context_data仍可调用{{ object }}的原因咨询
为什么注释
get_context_data后模板仍能调用{{ object }}? 这事儿其实很好理解——Django的DetailView本身就自带了默认的get_context_data实现,根本不需要咱们非得自己重写它!
当你把自己写的get_context_data注释掉之后,视图会自动去调用父类(DetailView继承的一系列基类,比如BaseDetailView和ContextMixin)里的默认方法。这个默认方法会帮你完成两件关键的事:
- 调用
get_object()方法,从你指定的queryset = product.objects.all()里匹配出对应的产品对象(根据URL里的slug或者pk参数) - 把这个获取到的对象自动放进上下文(context)字典里,默认的键就是
object,同时还会额外添加一个以模型小写名称命名的键(比如你的模型是product,那上下文里还会有product这个键,模板里也能调用{{ product }})
你之前重写get_context_data只是在父类的基础上做额外操作,但即使不重写,父类的逻辑已经足够把核心的对象数据传递给模板了,所以模板里的{{ object }}自然还能正常工作~
内容的提问来源于stack exchange,提问作者Flupper
相关产品推荐
相关产品推荐

