Django:基于'as_view()'方法的通用视图

时间:2015-07-18 12:13:34

标签: python django python-2.7 django-1.7

我正在开发一个应用程序,其中我创建了一个通用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"),
)

现在,我并没有真正理解文档中有关此方法的内容。有人可以对这个概念有所了解吗?

2 个答案:

答案 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函数的格式与之前不同,因为:

  
      
  1. 此视图实际上将实现为类
  2.   
  3. 我们将继承现有的通用视图函数,该函数已经完成了我们希望此视图函数执行的大部分工作   而不是从头开始写我们自己的。
  4.   
  5. 类方法as_view() - 这可以完成创建类实例的所有工作,并确保正确的处理程序方法   调用传入的HTTP请求。
  6.   

参考:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views