Django использует одну и ту же переменную в разных функциях

Я пытаюсь сделать следующее: получить данные из стороннего приложения и показать их на странице. Я буду получать данные в функции get_context_data и использовать те же данные в методе get_initial. У меня не получилось это сделать. Есть ли способ сделать это?

Пример кода


class UpdateView(generic.FormView):
    template_name = 'test.html'
    form_class = myForm
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        MYVARIABLE = fetch_data_from_3rd_party_app()
        context["MYVARIABLE"] = MYVARIABLE
        return context

    def get_initial(self):
        initial = super().get_initial()

        # I want to assign MYVARIABLE.data to initial["data"] here.
        initial["data"] = MYVARIABLE

        return initial

Есть несколько вариантов

Сначала есть подход, который используют общие представления из Django: хранить переменную на self, присваивать ее в какой-то ранней точке запроса (dispatch, get, post и т.д.), чтобы она была доступна тому, кому она нужна

class UpdateView(generic.FormView):

    def dispatch(self, request, *args, **kwargs):
        self.myvariable = fetch_data_from_3rd_party_app()
        return super().dispatch(request, *args, **kwargs)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["MYVARIABLE"] = self.myvariable
        return context

    def get_initial(self):
        initial = super().get_initial()
        initial["data"] = self.myvariable
        return initial

Я неравнодушен к использованию кэшированного свойства , присвоение self вне __init__ кажется мне немного неправильным (хотя на самом деле в этом нет ничего плохого)

from django.utils.functional import cached_property

class UpdateView(generic.FormView):

    @cached_property
    def myvariable(self):
        return fetch_data_from_3rd_party_app()
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["MYVARIABLE"] = self.myvariable
        return context

    def get_initial(self):
        initial = super().get_initial()
        initial["data"] = self.myvariable
        return initial
Вернуться на верх