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

Aar*_*ron 17 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()
Run Code Online (Sandbox Code Playgroud)

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)),
)
Run Code Online (Sandbox Code Playgroud)

我现在得到错误'function'对象没有属性'as_view'.

Tim*_*lor 65

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

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

  • 你是对的。我的基于类的视图遇到了同样的错误。我正在使用`@csrd-exempt` 装饰器,它显示了属性错误。+1! (2认同)

Ism*_*awi 26

def TestView(View):应该是class TestView(View):.就目前而言,您定义了一个函数,该函数TestView接受一个名为的参数View- 它的主体定义了一个内部函数,然后返回None.


ven*_*kat 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)
Run Code Online (Sandbox Code Playgroud)


Bin*_*ngh 8

我也得到了这个错误,但在我的情况下,我用以下的想法解决了它.

如果您尝试覆盖类,通常会发生该错误.如果您复制并粘贴代码并忘记更改例如类名,有时会发生这种情况.但就我而言,情况略有不同

如果您申请@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