如果我有一个视图类,并且我想在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?
]
答案 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 = []可以在括号内,甚至可以在元组中()