我的一个视图需要添加一个项目以及其他功能,但是我已经有另一个视图专门添加了一个项目。
我可以做类似的事情吗?
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
Answers:
View函数应将呈现的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
可能在模型或其他物体上运行。赛斯有一个正确的主意。最好是从两个视图中删除通用功能,然后将其放入一个函数中,view1
然后view2
两者都调用,然后它们返回各自的HttpResponse对象。无需生成将不使用的HttpResponse-尤其是如果其中包含需要大量查询的模板时,尤其如此。
更好的方法是使用模板系统。结合@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 %}
render_to_response
赞成render
。
没有基于类的视图:
def my_view(request):
return call_another_view(request)
def call_another_view(request):
return HttpResponse( ... )
具有基于类的视图:
def my_view(request):
return CallAnotherView.as_view()(request)
class CallAnotherView(View):
...
my_view(request)
还是CallAnotherView(View)
?