Доступ к контекстным данным Django в get_initial
У меня есть дорогой вызов в get_context_data моего представления для вычисления поля для шаблона. Я хотел бы использовать этот результат в get_initial_data представления для установки начального значения my_field, но я не вижу, как получить доступ к context_data из get_initial_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_initial
return self.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
"супер", потому что он вызывает 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_data
и get_initial
будет вызываться expensive_function
только один раз.