Django Rest Framework:'function'对象没有属性'as_view'

时间:2011-07-27 02:26:48

标签: django django-rest-framework

我一直在尝试使用Django Rest Framework获取ModelResource或View。我正在关注这些示例,但示例中的代码对我不起作用。谁能告诉我为什么我会收到这个错误。

views.py

# Create your views here.
from django.http import HttpResponse
from django.utils import simplejson
from django.core import serializers

from djangorestframework.views import View
from djangorestframework.response import Response
from djangorestframework import status

from interface.models import *

def TestView(View):
    def get(self, request):
        return Person.objects.all()

urls.py

from django.conf.urls.defaults import *
from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView, View
from interface.models import *
from interface.views import *

class PersonResource(ModelResource):
    model = Person
    ordering = ('LastName')

    urlpatterns = patterns('',    
    url(r'^$', 'interface.views.index'),
    url(r'^testview/$', TestView.as_view()),
    url(r'^people/$', ListOrCreateModelView.as_view(resource=PersonResource)),
)

我现在收到错误'function'对象没有属性'as_view'。

5 个答案:

答案 0 :(得分:63)

由于这是谷歌针对此错误消息的第一次点击,并且有一个比OP更微妙且可能是常见的原因,我在这里发布此评论。

在基于类的视图上使用标准视图装饰器而不是视图中的__dispatch__方法也可能导致此错误。

答案 1 :(得分:26)

添加到Tim Saylor点,

https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#id1

  

要装饰基于类的视图的每个实例,您需要进行装饰   类定义本身。要执行此操作,请将装饰器应用于   类的dispatch()方法。

     

类的方法与独立函数不完全相同,所以   你不能只是将函数装饰器应用于方法 - 你需要   首先将它转换为方法装饰器。 method_decorator   装饰器将函数装饰器转换为方法装饰器   它可以在实例方法上使用。例如:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

答案 2 :(得分:25)

def TestView(View):应为class TestView(View):。按照目前的情况,你定义一个名为TestView的函数,它接受一个名为View的参数 - 它的主体定义了一个内部函数,然后返回None

答案 3 :(得分:7)

我也遇到了这个错误,但在我的情况下,我用以下想法解决了这个问题。

如果您尝试覆盖类,通常会发生该错误。如果您复制并粘贴代码并忘记更改,则有时会发生这种情况。班级名称。但在我的情况下,它没什么不同

如果您将@login_required应用于某个课程,则会收到错误消息:

‘function’ object has no attribute ‘as_view’

那么,你现在应该如何装饰Django中的类? 对于基于类的视图,您有两种装饰类的选项。

1)装饰URLconf

2)装饰课程

这两个选项都会产生相同的结果 - 仅限记录用户访问类。选项之间的区别在于装饰器如何应用于类实例。请将此页面用于装饰器实现

https://docs.djangoproject.com/en/1.4/topics/class-based-views/#decorating-class-based-views

答案 4 :(得分:1)

如果使用类,则使用此装饰器 首先导入:

from django.utils.decorators import method_decorator

然后

@method_decorator(login_required(login_url='login'),name="dispatch")
class YourClassView(YourView):