Можно ли вызвать вид из другого представления?
Одно из моих представлений должно добавить элемент вместе с другими функциями, но у меня уже есть другое представление, которое специально добавляет элемент.
Могу ли я сделать что-то вроде:
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
Ответы
Ответ 1
Функции просмотра должны возвращать отображаемый 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)
...
Ответ 2
Конечно, до тех пор, пока все это будет сказано и сделано, ваше представление возвращает объект 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")
Ответ 3
Лучше всего использовать систему шаблонов. Сочетание идей от @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 %}