0

我对在 URL 中使用视图的这两种不同语法感到困惑。对于通用视图,我们使用这个

views.myview.as_view()

但是如果我需要使用我自己的自定义函数进行查看,那么我需要使用

views.myview().myfunction

为什么两者有区别

为什么不views.myview.myfunction工作

4

2 回答 2

1

视图可以写成类或函数。如果您不担心重用代码,那么函数可能更容易。查看用于编写视图的文档。然后可以快速查看基于类的视图的文档。最后检查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())
)

抱歉,如果我误解了您的问题

于 2012-12-04T03:43:30.930 回答
0

类方法创建一个视图函数,该as_view()函数将创建View该类的一个新实例,然后将控制权传递给它的dispatch方法。因此,您将拥有用于服务每个请求的不同视图实例。

在第二个示例中,您只创建了一个视图实例,并使用绑定方法作为视图函数。这意味着同一个实例用于服务每个请求(这也意味着它可以被两个请求同时使用。这种共享状态对于不阅读您的 urlconf 的人来说并不明显,因此可能会导致错误。

如果您只需要调度到不同的方法,请考虑覆盖dispatch. 如果您需要不同位置的视图的不同行为,您可以将关键字参数传递给as_view它将作为实例属性使用。dispatch

如果您需要在不同请求之间共享某些状态,请考虑在视图类的共享实例上使用比属性更明确的东西。

于 2012-12-04T03:13:00.833 回答