我的一個視圖需要添加一個項目以及其他功能,但是我已經有了另一個視圖,專門添加了一個項目。我可以從另一個視圖中調用視圖嗎?
我可以這樣做:當然
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
我的一個視圖需要添加一個項目以及其他功能,但是我已經有了另一個視圖,專門添加了一個項目。我可以從另一個視圖中調用視圖嗎?
我可以這樣做:當然
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
查看函數應返回渲染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")
只是爲了澄清你在做什麼:在第二個例子中,你只是在view1中啓動一些邏輯,對響應對象不會做任何事情,對吧? – 2011-01-26 19:39:44
是的,這是主意。 `view1`可能在模型的某個對象上運行。塞思雖然有正確的想法。最好從兩個視圖中取出通用的功能,並將它放入`view1`和`view2`這兩個函數中,然後返回它們各自的HttpResponse對象。不需要生成不會被使用的HttpResponse - 特別是如果它包含需要大量查詢的模板。 – brady 2011-01-26 22:14:15
@ brady,如何在模板中調用view1的變量或如何使用view1的變量來顯示 – user2086641 2013-07-17 13:55:17
更好的方法是使用模板系統。結合從@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 %}
我認爲它更簡單的使用:返回specific_add_item_view(要求) – 2017-07-15 07:17:05