我正在开发一个应用程序,其中我创建了一个通用ListView
。现在,在urls.py
中定义该视图时,我从文档中读到了我需要使用as_view()
方法,如下所示:
from django.conf.urls import patterns, include, url
from .views import BlogIndex
urlpatterns = patterns(
'',
url(r'^$', BlogIndex.as_view(), name="index"),
)
现在,我并没有真正理解文档中有关此方法的内容。有人可以对这个概念有所了解吗?
答案 0 :(得分:16)
在基于类的视图中,您必须调用as_view()
函数才能返回可调用视图,该视图需要request
并返回response.
< strong>在通用视图的情况下,它是请求 - 响应周期的主要入口点。
as_view
是函数(类方法),它将我的MyView
类与其网址连接。
来自django docs:
classmethod as_view(** initkwargs)
返回一个可调用的视图,该视图接收请求并返回响应:
您无法像在普通的基于函数的视图中那样使用基于类的视图。
BlogIndex(request) # can't do this in case of CBVs
如果您希望CBV正常运行,上述代码无效。为此,您需要提供一个可调用的视图,然后将请求传递给它。例如:
response = MyView.as_view()(request) # valid way
通过调用我的视图类as_view()
上的MyView
函数,我将给出一个视图,我将调用request
参数来启动请求 - 响应周期。
在您的情况下:
my_callable_view = BlogIndex.as_view() # returns a callable view
<function blog.views.BlogIndex>
现在,调用此函数并传递request
。
response = my_callable_view(request) # generate proper response
答案 1 :(得分:0)
view函数的格式与之前不同,因为:
- 此视图实际上将实现为类
- 我们将继承现有的通用视图函数,该函数已经完成了我们希望此视图函数执行的大部分工作 而不是从头开始写我们自己的。
- 类方法as_view() - 这可以完成创建类实例的所有工作,并确保正确的处理程序方法 调用传入的HTTP请求。
醇>
参考:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views