Подтвердить что ты не робот

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

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

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

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

def big_view(request):
    # ...
    specific_add_item_view(request)
4b9b3361

Ответ 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 %}