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

gxwragnw  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(167)

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

现在,我真的不明白文档中关于这个方法的内容。有人能解释一下这个概念吗?

brjng4g3

brjng4g31#

在基于类的视图中,需要调用as_view()函数才能返回一个可调用视图,该视图接受一个request并返回一个response.这是泛型视图中请求-响应循环的主要入口。

as_view是将我的MyView类与其url连接的函数(类方法)。

Django文档:
classmethod as_view(**initkwargs)
返回接受请求并返回响应的可调用视图:
你不能像在普通的基于函数的视图中那样使用基于类的视图。

BlogIndex(request) # can't do this in case of CBVs

如果您希望CBV正常工作,则上述代码无效。为此,您需要提供一个可调用的视图,然后向其传递请求。例如:

response = MyView.as_view()(request)  # valid way

通过调用我的视图类MyView上的as_view()函数,将给予我一个视图,我将使用request参数调用该视图以启动请求-响应循环。

您的情况:

my_callable_view = BlogIndex.as_view() # returns a callable view
<function blog.views.BlogIndex>

现在,调用此函数并传递request

response = my_callable_view(request) # generate proper response
inb24sb2

inb24sb22#

视图函数格式与以前不同,因为:
1.这个视图实际上将被实现为一个类
1.我们将继承一个现有的通用视图函数,它已经完成了我们希望这个视图函数做的大部分事情,而不是从头开始编写我们自己的视图函数。
1.类方法as_view()--这将完成创建类示例的所有工作,并确保为传入的HTTP请求调用正确的处理程序方法。
参考:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views

anhgbhbe

anhgbhbe3#

也许我可以尝试用伪代码编写as_view:

class ViewClass():
      #other stuff
      def as_view(self):
           return self.render(*args)

它返回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源代码的话,你可以这样理解。

相关问题