在get_initial中访问Django上下文数据



我在视图的get_context_data中有一个昂贵的调用来计算模板的字段。我想在视图的get_initial_data中使用此结果来设置my_field的初始值,但我看不到如何从get_initial_data中访问context_data或如何将其作为参数传递。

def get_context_data( self, *args, **kwargs ):
context = super().get_context_data( **kwargs )
context['expensive_result'] = expensive_function()
return context
def get_initial( self, *args, **kwargs ):
initial = super().get_initial( **kwargs )
# Initialise my_field with expensive result calculated in get_context_data
initial['my_field'] = context['expensive_result']     # How to do this?
return initial

get_initialreturnself.initial.copy()by docs

所以,你可以写:

def get_context_data( self, *args, **kwargs ):
expensive_value = expensive_function()
self.initial['my_field'] = expensive_value
context = super().get_context_data( **kwargs )
context['expensive_result'] = expensive_value
return context

你需要在get_context_data'super'调用之前调用它,因为它在自身内部调用get_initial

或者你可以添加字段到你的视图类,并为它写属性:

class SomeView(CreateView):
_expensive_value = None

@propetry
def expensive_value(self):
if self._expensive_value is None:
self._expensive_value = expensive_function()
return self._expensive_value
def get_context_data( self, *args, **kwargs ):
context = super().get_context_data( **kwargs )
context['expensive_result'] = self.expensive_value
return context
def get_initial( self, *args, **kwargs ):
initial = super().get_initial( **kwargs )
initial['my_field'] = self.expensive_value
return initial

并且在get_context_dataget_initial中同时使用此属性将只调用一次expensive_function

最新更新