我可以从另一个视图中调用视图吗?

我的观点之一需要添加一个项目,以及其他function,但我已经有另一个视图,专门添加一个项目。

我可以做些什么:

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,那么就把它存储到某个variables中来忽略:

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