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

时间:2011-01-26 18:22:05

标签: django django-views

我的一个视图需要添加一个项目以及其他功能,但我已经有另一个视图,它专门添加了一个项目。

我可以这样做:

def specific_add_item_view(request):
    item = Item.objects.create(foo=request.bar)

def big_view(request):
    # ...
    specific_add_item_view(request)

5 个答案:

答案 0 :(得分:58)

当然,只要说完所有内容,您的视图就会返回一个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")

答案 1 :(得分:48)

查看函数应该将呈现的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)
    ...

答案 2 :(得分:8)

更好的方法是使用模板系统。结合@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 %}

答案 3 :(得分:1)

没有基于类的视图:

def my_view(request):
    return call_another_view(request)

def call_another_view(request):
    return HttpResponse( ... )

使用class based views

def my_view(request):
    return CallAnotherView.as_view()(request)

class CallAnotherView(View):
    ...

答案 4 :(得分:0)

你可以这样做:

def foo(req):
  # code
def index(req):
  return foo(req)