Вызов функции из функции
У меня есть некоторая логика в представлении, которую я хочу отобразить на нескольких шаблонах.
Как вызвать логическое представление из другого представления и передать данные обратно в представление для отображения?
Это простой тест, который я проводил.
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, чтобы вы могли отобразить их на нескольких шаблонах. Это должно помочь.