2011-01-26 174 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 %} 
相关问题