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

Posted

技术标签:

【中文标题】Django:基于通用视图的“as_view()”方法【英文标题】:Django: Generic views based 'as_view()' method 【发布时间】:2015-10-08 01:44:11 【问题描述】:

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

现在,我并没有真正理解文档对这种方法的描述。有人能解释一下这个概念吗?

【问题讨论】:

你的问题不清楚。 as_view() 是您必须调用才能将基于类的视图链接到您的 URL。你在问什么? @DanielRoseman 我猜你刚刚回答了我的问题。谢谢。 【参考方案1】:

在基于类的视图中,您必须调用as_view() 函数以返回一个可调用视图,该视图采用request 并返回response. 它是主要条目- 在通用视图的情况下,请求-响应周期中的点。

as_view 是将我的MyView 类与其网址连接起来的函数(类方法)。

来自django docs:

类方法 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

【讨论】:

【参考方案2】:

查看函数的格式与以前不同,因为:

    这个视图实际上将作为一个类实现 我们将继承现有的通用视图函数,该函数已经完成了我们希望该视图函数完成的大部分工作,而不是 而不是从头开始编写自己的代码。 类方法 as_view() - 它完成创建类实例的所有工作,并确保正确的处理程序方法 为传入的 HTTP 请求调用。

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

【讨论】:

【参考方案3】:

也许我可以尝试用伪代码编写 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') 相同 当然,实际上除了渲染函数之外还有很多事情要做,例如验证和保存 post queryDict 中的内容,实际上你需要 def post(): 来处理帖子,在函数中你只是 if request.method == 'POST' 他们实际上是相互的。 具体来说,as_view() 只是生成一个整体的函数,包括 if request.method =='POST': #some code 可能实际代码不是这样的,但是如果你不准备自己贡献django源代码的话,可以这样理解。

【讨论】:

以上是关于Django:基于通用视图的“as_view()”方法的主要内容,如果未能解决你的问题,请参考以下文章

Django - 通过通用视图加载 Robots.txt

django 类通用视图详解

Django-基于session的登录

手动调用基于类的通用视图

Django drf:cbv(class base view)源码分析

django-基于类的视图