2011-07-27 25 views
14

我一直在嘗試一段時間才能使用Django Rest Framework獲取ModelResource或View。我遵循這些示例,但示例中的代碼不適合我。誰能告訴我爲什麼我可能會得到這個錯誤。Django Rest Framework:'function'對象沒有屬性'as_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)), 
) 

現在我得到的錯誤 '功能' 對象有沒有屬性 'as_view'。

回答

22

def TestView(View):應該是class TestView(View):。現在,您可以定義一個名爲TestView的函數,該函數採用名爲View的參數 - 它的主體定義了一個內部函數,然後返回None

+0

謝謝!我曾希望只是我看了太多的代碼,然後纔看不到問題。 – Aaron

54

由於這是該錯誤消息在谷歌上排名第一,並且存在比OP更爲微妙和可能的常見原因,因此我在此發佈此評論。

此錯誤也可能是由於在基於視圖的視圖中使用標準視圖裝飾器而不是視圖中的__dispatch__方法造成的。

+1

你說得對。我面對基於類的視圖時遇到同樣的錯誤。我使用'@ csrd-exempt'裝飾器,它顯示了屬性錯誤。 +1! –

+0

通常我不會贊同這一點,但你只是讓我頭痛,所以我現在不在乎。^_^ –

20

要添加添塞勒點,

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) 
+0

謝謝你,還有Tim Saylor。正是我在找什麼。 – flinz

+0

上帝保佑你這樣的人 – Trm

+0

3年半後,你發佈了它,它已經救了我的培根!乾杯venkat! – TimJ

6

我也收到此錯誤,但我的情況下,我用下面的想法解決它。

如果您嘗試覆蓋某個類,通常會發生此錯誤。如果您複製&粘貼代碼並忘記更改班級名稱。但對我來說這是有點不同

如果你申請@login_required一類,你會收到錯誤消息:

‘function’ object has no attribute ‘as_view’

那麼,你又該如何在Django現在裝飾類? 對於基於類的視圖,您有兩種裝飾類的選項。

1)裝飾URL配置

2)裝飾類

兩個選項都導致相同的結果 - 僅限制爲登錄用戶的訪問的一類。該選項的區別是裝飾是如何應用到類instance.Refer此頁面裝飾實現

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

+0

謝謝。我也遇到過這個問題。其實,我不需要那個裝飾者。 –

+1

工作鏈接:https://docs.djangoproject.com/en/1.11/topics/class-based-views/intro/#id1 – Kopfgeldjaeger

相關問題