2011-07-27 48 views
14

Próbowałem przez jakiś czas, aby uzyskać ModelResource lub widok działający przy użyciu Django Rest Framework. Podążam za przykładami, ale kod w przykładach nie działa dla mnie. Czy ktoś może mi powiedzieć, dlaczego dostaję tego błędu?Django Rest Framework: obiekt "function" nie ma atrybutu "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)), 
) 

Jestem teraz coraz błąd 'funkcja' obiekt ma atrybut 'as_view'.

Odpowiedz

22

def TestView(View): powinien być class TestView(View):. W obecnej postaci zdefiniowano funkcję o nazwie TestView, która przyjmuje argument o nazwie View - jej ciało definiuje funkcję wewnętrzną, a następnie zwraca None.

+0

Dziękujemy! Miałem nadzieję, że to tylko moje spojrzenie na kod zbyt wiele, a następnie nie mogłem zobaczyć problemu. – Aaron

54

Ponieważ jest to pierwsze trafienie w Google dla tego komunikatu o błędzie i jest bardziej subtelna i prawdopodobnie najczęstsza przyczyna tego niż OP, zamieszczam tutaj ten komentarz.

Ten błąd może być również spowodowany przez użycie standardowego dekoratora widoku w widoku opartym na klasach zamiast na metodzie __dispatch__ w widoku.

+1

Masz rację. Stawiłem czoła temu samemu błędowi w moim widoku opartym na klasie. Używałem dekoratora '@ csrd-exempt' i pokazywałem błąd atrybutu. +1! –

+0

Zwykle nie pochwalam tego, ale właśnie uratowałeś mi ból głowy, więc nie obchodzi mnie to teraz.^_^ –

20

Aby dodać do punktu Tim Saylor,

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

Aby ozdobić każde wystąpienie widokiem na bazie klasy, trzeba ozdobić samą definicję klasy. Aby to zrobić, zastosuj dekorator do metody dispatch() klasy .

Metoda na klasie nie jest taka sama jak funkcja samodzielna, więc nie można po prostu zastosować do metody dekoratora funkcji - trzeba najpierw przekształcić ją w dekorator metod. Dekorator method_decorator przekształca dekorator funkcji w dekorator metod, dzięki czemu można go zastosować w metodzie instancji. Na przykład:

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

Dzięki za to, a także Tim Saylor. Dokładnie to, czego szukałem. – flinz

+0

Niech Bóg błogosławi ludzi takich jak Ty – Trm

+0

3 i pół roku po tym, jak to napisałeś, właśnie uratowałeś mi bekon! Pozdrawiam venkat! – TimJ

6

Ja również otrzymuję ten błąd, ale w moim przypadku to rozwiązać następujący pomysł.

Ten błąd zazwyczaj występuje, gdy próbujesz przesłonić klasę. To się czasem zdarza, jeśli skopiujesz kod & i zapomnisz zmienić np. nazwa klasy. Ale w moim przypadku było trochę inaczej

Jeśli stosuje @login_required do klasy, otrzymasz komunikat o błędzie:

‘function’ object has no attribute ‘as_view’

Tak, jak należy ozdobić zajęcia w Django teraz? W widokach klasowych masz dwie opcje dekorowania swoich zajęć.

1) Dekorowanie URLconf

2) dekorowanie klasa

obie opcje prowadzi do tego samego rezultatu - ograniczenie dostępu do klasy tylko dla zalogowanych użytkowników. Różnica między tymi opcjami jest jak dekorator jest stosowana do klasy instance.Refer tej strony do realizacji dekoratorów

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

+0

Dzięki. Również napotkałem ten problem. Właściwie nie potrzebowałem tego dekoratora. –

+1

Łącze robocze: https://docs.djangoproject.com/en/1.11/topics/class-based-views/intro/#id1 – Kopfgeldjaeger

Powiązane problemy