Django:为什么ViewClass.as_view在URLconf中使用括号?

时间:2017-11-26 10:44:21

标签: django

如果我有一个视图类,并且我想在URLconf中使用它,我将不得不使用它的as_view() - 方法,因为视图类不是一个函数,而是一个类。我的问题是,在URLconf中,为什么用括号调用as_view()?这是否意味着该函数将在读取URLconf时运行?如果是这样,as_view究竟是什么呢?

示例:

# urls.py
from django.conf.urls import url
from some_app.views import AboutView

urlpatterns = [
    url(r'^about/$', AboutView.as_view()), # <--- We're calling the method. Why?
]

2 个答案:

答案 0 :(得分:0)

人们在基于类的视图中创建的几乎所有视图都是核心Django CBV的子类。这意味着您继承了as_view方法,正如您在上面指出的那样。我们为什么需要那个?它正好在文档中宣称CBV的部分之下,我相信你已经把它作为你问题的一个例子:

# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

所以在urls.py中你可以引用它 - 除了Django urls调度程序is looking for a callable function(在1.10之后)。

  

因为Django的URL解析器希望发送请求和   可调用函数的关联参数,而不是类,基于类   视图有一个as_view()类方法,它返回一个可以的函数   当请求到达匹配关联的URL时调用   图案。

每个子类视图都继承提供此功能的as_view方法,在URL删除时调用。这将返回一个函数,该函数可以在请求时使用(根据丹尼尔在下面的评论。)

来自as_view section of the docs

  

在请求/响应周期中调用视图时,   HttpRequest被分配给视图的请求属性。任何   从URL模式捕获的位置和/或关键字参数是   分别分配给args和kwargs属性。然后   调用dispatch()。

这使得它的功能与长篇FBV相同,后者接受请求, stuff 然后返回HttpResponse:

def some_view(request): 
    pass #do some stuff 
    context = { "foo": "bar"}
    return render(request, 'about.html', context)

答案 1 :(得分:-1)

根据我的知识,所有观点都应该是基于功能的,尽管包括基于类的视图的简单性(技术上不正确):

所以 as_view()方法将其转换为基于函数的视图

你可以参考这个网站cbv实际上是如何进入的: https://ccbv.co.uk/

urlpatterns = []可以在括号内,甚至可以在元组中()