20

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

视图.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()

网址.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)),
)

我现在收到错误“函数”对象没有属性“as_view”。

4

5 回答 5

68

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

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

于 2012-05-14T14:51:34.670 回答
29

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

于 2011-07-27T04:04:40.910 回答
28

添加到 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)
于 2013-07-12T09:05:15.887 回答
9
于 2014-01-23T11:17:01.053 回答
1

use this if you use a class your decorator should be import first:

from django.utils.decorators import method_decorator

then

@method_decorator(login_required(login_url='login'),name="dispatch")
class YourClassView(YourView):
于 2019-09-30T21:59:23.763 回答