2011-01-26 175 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(要求) – 2017-07-15 07:17:05

回答

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) 
    ... 
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中啓動一些邏輯,對響應對象不會做任何事情,對吧? – 2011-01-26 19:39:44

+4

是的,這是主意。 `view1`可能在模型的某個對象上運行。塞思雖然有正確的想法。最好從兩個視圖中取出通用的功能,並將它放入`view1`和`view2`這兩個函數中,然後返回它們各自的HttpResponse對象。不需要生成不會被使用的HttpResponse - 特別是如果它包含需要大量查詢的模板。 – brady 2011-01-26 22:14:15

+0

@ brady,如何在模板中調用view1的變量或如何使用view1的變量來顯示 – user2086641 2013-07-17 13:55:17

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 %} 
相關問題