我在一个应用程序中创建了一个通用的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"),
)
现在,我真的不明白文档中关于这个方法的内容。有人能解释一下这个概念吗?
3条答案
按热度按时间brjng4g31#
在基于类的视图中,需要调用
as_view()
函数才能返回一个可调用视图,该视图接受一个request
并返回一个response.
这是泛型视图中请求-响应循环的主要入口。as_view
是将我的MyView
类与其url连接的函数(类方法)。Django文档:
classmethod as_view(**initkwargs)
返回接受请求并返回响应的可调用视图:
你不能像在普通的基于函数的视图中那样使用基于类的视图。
如果您希望CBV正常工作,则上述代码无效。为此,您需要提供一个可调用的视图,然后向其传递请求。例如:
通过调用我的视图类
MyView
上的as_view()
函数,将给予我一个视图,我将使用request
参数调用该视图以启动请求-响应循环。您的情况:
现在,调用此函数并传递
request
。inb24sb22#
视图函数格式与以前不同,因为:
1.这个视图实际上将被实现为一个类
1.我们将继承一个现有的通用视图函数,它已经完成了我们希望这个视图函数做的大部分事情,而不是从头开始编写我们自己的视图函数。
1.类方法as_view()--这将完成创建类示例的所有工作,并确保为传入的HTTP请求调用正确的处理程序方法。
参考:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views
anhgbhbe3#
也许我可以尝试用伪代码编写as_view:
它返回CBV内部的渲染函数。所以它实际上和path('some_path',views.some_view_function,name='some_name')是一样的。当然,实际上除了render函数之外还有更多的事情要做,例如验证和保存post queryDict中的内容,实际上你需要
def post():
来处理post,在函数中你只需要if request.method == 'POST'
它们实际上是相互的。具体来说,as_view()只是生成一个完整的函数,包括if request.method =='POST': #some code
。也许实际的代码不是这样工作的,但是如果你不准备自己贡献django源代码的话,你可以这样理解。