我对这两种在URL中使用视图的不同语法感到困惑。对于通用视图,我们使用此
views.myview.as_view()
但是如果我需要使用自己的自定义函数进行查看,那么我需要使用
views.myview().myfunction
为什么两者之间存在差异
views.myview.myfunction
为何不起作用
答案 0 :(得分:1)
视图可以写为类或函数。如果您不担心重用代码,那么函数可能更容易。看看docs for writing views。然后可以快速查看docs for class based views。最后,查看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())
)
如果我误解了你的问题,请道歉
答案 1 :(得分:0)
as_view()
类方法创建一个视图函数,该函数将创建View
类的新实例,然后将控制传递给其dispatch
方法。因此,您将拥有用于为每个请求提供服务的不同视图实例。
在第二个示例中,您只创建一个视图实例,并使用bound方法作为视图函数。这意味着同一个实例用于为每个请求提供服务(这也意味着它可以被两个请求同时使用。对于那些没有读取你的urlconf的人来说,这个共享状态不会很明显,因此可能会导致错误。 / p>
如果您只需要调度到其他方法,请考虑覆盖dispatch
。您可以将关键字参数传递给as_view
,如果您需要在不同位置的视图中使用不同的行为,则可以将其作为dispatch
中的实例属性使用。
如果您需要在不同请求之间共享某些状态,请考虑在视图类的共享实例上使用比属性更明确的内容。