我对在 URL 中使用视图的这两种不同语法感到困惑。对于通用视图,我们使用这个
views.myview.as_view()
但是如果我需要使用我自己的自定义函数进行查看,那么我需要使用
views.myview().myfunction
为什么两者有区别
为什么不views.myview.myfunction
工作
视图可以写成类或函数。如果您不担心重用代码,那么函数可能更容易。查看用于编写视图的文档。然后可以快速查看基于类的视图的文档。最后检查URL dispatcher的文档。
视图函数是这样写的——
def my_view(request, *args, **kwargs):
...
return HttpResponse()
通过将函数传递给 urlpatterns 来调用视图函数,如下所示 -
from django.conf.urls import patterns
from views import my_view
urlpatterns = patterns('',
(r'^my_page/$', my_view)
)
基于类的视图允许您通过继承重用功能。
from django.views.generic import DetailView
class MySpecialDetailView(DetailView):
...
# add functionality here
问题是 url 设置需要一个函数,而不是一个类。这就是as_view()
函数的用武之地。基于类的视图在 url conf 中被调用为 -
from django.conf.urls import patterns
from views import MySpecialDetailView
urlpatterns = patterns('',
(r'^my_special_page/$', MySpecialDetailView.as_view())
)
抱歉,如果我误解了您的问题
类方法创建一个视图函数,该as_view()
函数将创建View
该类的一个新实例,然后将控制权传递给它的dispatch
方法。因此,您将拥有用于服务每个请求的不同视图实例。
在第二个示例中,您只创建了一个视图实例,并使用绑定方法作为视图函数。这意味着同一个实例用于服务每个请求(这也意味着它可以被两个请求同时使用。这种共享状态对于不阅读您的 urlconf 的人来说并不明显,因此可能会导致错误。
如果您只需要调度到不同的方法,请考虑覆盖dispatch
. 如果您需要不同位置的视图的不同行为,您可以将关键字参数传递给as_view
它将作为实例属性使用。dispatch
如果您需要在不同请求之间共享某些状态,请考虑在视图类的共享实例上使用比属性更明确的东西。