Могу ли я вызвать представление из другого представления?
один из моих представлений должен добавить элемент вместе с другими функциями, но у меня уже есть другое представление, которое специально добавляет элемент.
могу ли я сделать что-то вроде:
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
3 ответа:
функции просмотра должны возвращать визуализированный HTML обратно в браузер (в
HttpResponse
). Вызов представления в представлении означает, что вы (потенциально) выполняете рендеринг дважды. Вместо этого просто разложите "добавить" в другую функцию, которая не является представлением, и вызовите ее в обоих представлениях.def add_stuff(bar): item = Item.objects.create(foo=bar) return item def specific_add_item_view(request): item = add_stuff(bar) ... def big_view(request): item = add_stuff(bar) ...
конечно, пока все сказано и сделано, ваше представление возвращает объект HttpResponse. Полностью допустимо следующее:
def view1(request): # do some stuff here return HttpResponse("some html here") def view2(request): return view1(request)
Если вы не хотите возвращать HttpResponse из первого представления, то просто сохраните его в некоторую переменную, чтобы игнорировать:
def view1(request): # do some stuff here return HttpResponse("some html here") def view2(request): response = view1(request) # do some stuff here return HttpResponse("some different html here")
лучший способ-использовать систему шаблонов. Объединение идей от @Seth и @brady:
def specific_add_item_view(request, extra_context_stuff=None): Item.objects.create() context_variables = {} # obviously want to populate this if extra_context_stuff: context_variables.update(extra_context_stuff) return render(request, 'app_name/view1_template.html', context_variables) def bigger_view(request): extra_context_stuff = {'big_view': True} return specific_add_item_view(request, extra_context_stuff)
и ваш app_name / view1_template.html может содержать условный тег шаблона
{% if big_view %} <p>Extra html for the bigger view</p> {% endif %}