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

joh*_*n2x 65 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)
Run Code Online (Sandbox Code Playgroud)

bra*_*ady 63

当然,只要说完所有内容,你的视图就会返回一个HttpResponse对象.以下内容完全有效:

def view1(request):
    # do some stuff here
    return HttpResponse("some html here")

def view2(request):
    return view1(request)
Run Code Online (Sandbox Code Playgroud)

如果您不想从第一个视图返回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")
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是个主意.`view1`可能在模型的对象上运行.塞思有正确的想法.最好从两个视图中取出通用功能,并将其放入`view1`和`view2`都调用的函数中,然后返回各自的HttpResponse对象.无需生成不会被使用的HttpResponse - 特别是如果它包含需要大量查询的模板. (5认同)
  • 虽然Seth有正确的想法,如果需要从第三方应用程序调用视图,您的解决方案是要走的路! (3认同)

Set*_*eth 49

视图函数应该将呈现的HTML返回给浏览器(在a中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)
    ...
Run Code Online (Sandbox Code Playgroud)

  • 如果被叫视图位于第三方应用程序中,我们该怎么办? (19认同)

hob*_*obs 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)
Run Code Online (Sandbox Code Playgroud)

您的app_name/view1_template.html可能包含条件模板标记

{% if big_view %}
<p>Extra html for the bigger view</p>
{% endif %}
Run Code Online (Sandbox Code Playgroud)


Gui*_* IA 8

没有基于类的视图:

def my_view(request):
    return call_another_view(request)

def call_another_view(request):
    return HttpResponse( ... )
Run Code Online (Sandbox Code Playgroud)

使用基于类的视图

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

class CallAnotherView(View):
    ...
Run Code Online (Sandbox Code Playgroud)