Django在视图的URL中调用函数

时间:2012-12-04 02:35:47

标签: python django

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

views.myview.as_view()

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

views.myview().myfunction

为什么两者之间存在差异

views.myview.myfunction为何不起作用

2 个答案:

答案 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中的实例属性使用。

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