如何在Django视图的get_initial中访问get_context_data的计算结果
解决方案
Django 类视图中 get_initial 的执行时机早于 get_context_data,因此无法在 get_initial 中直接获取 get_context_data 生成的上下文数据。你可以将高开销函数的计算结果缓存到视图实例的属性上,保证计算仅执行一次,两个方法都可以复用结果:
# 封装带缓存的计算方法,仅首次调用时执行高开销逻辑 def get_expensive_result(self): if not hasattr(self, '_expensive_result'): self._expensive_result = expensive_function() return self._expensive_result def get_context_data(self, *args, **kwargs): context = super().get_context_data(**kwargs) context['expensive_result'] = self.get_expensive_result() return context def get_initial(self, *args, **kwargs): initial = super().get_initial(**kwargs) # 直接调用缓存方法获取结果,不会重复执行高开销逻辑 initial['my_field'] = self.get_expensive_result() return initial
方案说明
- 缓存是请求级别的,每个请求对应独立的视图实例,不会出现不同请求之间的数据串扰问题
- 不管两个方法的执行顺序如何,高开销函数最多只会执行一次,没有额外性能损耗
- 不需要调整原有视图的执行流程,兼容性高
内容的提问来源于stack exchange,提问作者Peter Carr
相关产品推荐
相关产品推荐

