我的一个视图需要添加一个项目,除此之外还有其他功能,但我已经有另一个专门用于添加项目的视图。
我是否可以像这样做:
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
我的一个视图需要添加一个项目,除此之外还有其他功能,但我已经有另一个专门用于添加项目的视图。
我是否可以像这样做:
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
当然可以,只要最终你的视图返回一个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
可能对一个模型对象或其他什么东西进行操作。不过 Seth 的想法是正确的。最好的做法可能是将两个视图中的公共功能提取出来,放入一个函数中,让 view1
和 view2
都调用该函数,然后它们返回各自的 HttpResponse 对象。没必要生成一个不会被使用的 HttpResponse - 特别是如果其中包含需要执行大量查询的模板。 - bradyview2(request)
会处理由view2(request)
返回的结果吗? - Gathide视图函数应该返回一个渲染后的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)
...
没有基于类的视图:
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)
? - Gathidedef 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
。 - hobsclass CheckoutPage(View):
template_name = "checkout.html"
def get(self, request):
prices = ViewAllPrices.as_view()(request)
return render(request, self.template_name, {'prices': prices})
def calledView(bar):
...
return Response(...)
def base_view(request):
resp = add_stuff(request)
...
所以你应该这样做:
request
参数必须是django.http.HttpRequest
的实例,而不是rest_framework.request.Request
.
def calledView(request):
...
return Response(...)
def base_view(request):
resp = add_stuff(request._request)
...
def foo(req):
# code
def index(req):
return foo(req)