Вызов функции из функции

У меня есть некоторая логика в представлении, которую я хочу отобразить на нескольких шаблонах.

Как вызвать логическое представление из другого представления и передать данные обратно в представление для отображения?

Это простой тест, который я проводил.

def table_view(request):
    today = now().date()
    project_data = get_data_view
    context = {'projects_data':project_data}
    
    return render(request, "pages/project_table.html", context=context)

def get_data_view(request):
    project_list = Project.objects.all()
    context = {"project_list":project_list}
    return {'context':context}

Представление таблицы просто отображает таблицу, но данные внутри таблицы я хочу получить из get_data_view

Я знаю, что могу написать логику внутри одного представления, но некоторые из моих представлений содержат много кода, и я не хочу повторять один и тот же код для получения одних и тех же данных.

В функциях представления нет никакой особой магии - это просто свобода вызова других функций, которые выполняют рендеринг. Поэтому вместо того, чтобы считать table_view функцией "представления", рассматривайте ее просто как помощника функции get_data_view:

def table_view(request, context=None):
    if context is None: context=dict()
    today = now().date()
    context.update({'some_other_data':'some value'})
    
    return render(request, "pages/project_table.html", context=context)

def get_data_view(request):
    project_list = Project.objects.all()
    context = {"project_list":project_list}
    return table_view(request, 'context':context)

Или я чего-то не понимаю в том, что вы пытаетесь сделать?

Кроме того, именно поэтому мне нравятся представления на основе классов - вы можете определить класс 'TableView', а затем создать его подкласс для всех необходимых вам экземпляров таблицы с различными источниками данных (или использовать один из пакетов аддонов django, который уже делает это :-) ).

Вы можете просто вызвать функцию get_data_view из вашей функции логического представления. Функция get_data_view вернет нужные вам данные, и вы сможете отобразить их, как вы уже делаете это в функции table_view.

Вы уже сделали большую часть работы. Вам следует просто изменить код следующим образом


    def table_view(request):
        today = now().date()
        project_data = get_data_view()
        context = {'projects_data':project_data}
        
        return render(request, "pages/project_table.html", context=context)
    
    def get_data_view():
        project_list = Project.objects.all()
        return project_list

Согласно вашему подходу, ваша get_data_view возвращает словарь, в котором значениями являются объекты Project. Насколько я понимаю вашу проблему, вы просто хотите, чтобы функция get_data_view возвращала данные project_list, чтобы вы могли отобразить их на нескольких шаблонах. Это должно помочь.

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