Доступ к контекстным данным 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 только один раз.

Вернуться на верх