Могу ли я вызвать представление из другого представления?


один из моих представлений должен добавить элемент вместе с другими функциями, но у меня уже есть другое представление, которое специально добавляет элемент.

могу ли я сделать что-то вроде:

def specific_add_item_view(request):
    item = Item.objects.create(foo=request.bar)

def big_view(request):
    # ...
    specific_add_item_view(request)
3 59

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 %}