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()”方法的主要内容,如果未能解决你的问题,请参考以下文章