Django内置基于类的视图:self.object的来源是哪里?
Django SingleObjectMixin中self.object的创建位置
SingleObjectMixin里的self.object是由**get_object()方法**负责获取并赋值的,你贴的代码片段里省略了这部分核心实现。
具体逻辑:
get_object()先通过get_queryset()拿到查询集:优先用你定义的self.queryset,如果没设置,就基于self.model生成默认查询集self.model.objects.all()。- 接着从URL路由参数中提取
pk或slug(对应Mixin的pk_url_kwarg、slug_url_kwarg属性,默认值是pk和slug);如果开启了query_pk_and_slug=True,会同时用两个参数过滤查询集。 - 最后从查询集中取出唯一匹配的对象,这个对象会被返回,在视图的执行流程中,调用
get_object()的地方会把返回值赋值给self.object。
触发时机:
当使用继承了SingleObjectMixin的视图(比如DetailView、UpdateView)时,视图的get()(或post(),比如更新类视图)方法会主动调用get_object(),完成self.object的赋值,之后调用get_context_data()时,这个属性就已经存在了。
举个简化的调用流程示例:
class DetailView(SingleObjectMixin, TemplateResponseMixin, BaseDetailView): def get(self, request, *args, **kwargs): self.object = self.get_object() # 在这里完成self.object的赋值 context = self.get_context_data(object=self.object) return self.render_to_response(context)
内容的提问来源于stack exchange,提问作者행신경자
相关产品推荐
相关产品推荐

