我可以从另一个视图中调用视图吗?
我的一个视图需要添加一个项目以及其他功能,但是我已经有了另一个视图,专门添加了一个项目。我可以从另一个视图中调用视图吗?
我可以这样做:当然
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