2011-01-26 3 views
50

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

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

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

def big_view(request): 
    # ... 
    specific_add_item_view(request) 
+0

я считаю его более простое использование: возвращение specific_add_item_view (запрос) –

ответ

38

Посмотреть функции должны возвращать тонированном 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) 
    ... 
+15

Что мы будем делать, если вызываемый вид находится в стороннем приложении? –

+0

Seth, как вызвать переменную view1 в шаблоне или как использовать переменную view1 для отображения – user2086641

50

Конечно, до тех пор, когда все сказано и сделано, ваше представление возвращает объект 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") 
+0

Только для уточните, что вы делаете: во втором примере вы просто запускаете некоторую логику в view1, ничего не будете делать с объектами ответа, правильно? –

+4

Да, это идея. 'view1', вероятно, работает на объекте модели или что-то в этом роде. Однако у Сета есть правильная идея. Вероятно, лучше всего использовать общую функциональность из обоих представлений и поместить ее в функцию, которую 'view1' и' view2' вызывают, а затем возвращают свои соответствующие объекты HttpResponse. Не нужно генерировать HttpResponse, который не будет использоваться, особенно если это включает шаблон, требующий много запросов. – brady

+0

@ brady, как вызвать переменную view1 в шаблоне или как использовать переменную view1 для отображения – user2086641

4

Лучшим способом является использование системы шаблонов. Сочетание идеи из @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 %} 
+0

Спасибо @Neceros за то, что последние версии django осуждают 'render_to_response' в пользу' render'. – hobs

Смежные вопросы