register - Django Rest Framework: el objeto ''function'' no tiene ningún atributo ''as_view''
get_object_or_404 django rest framework (4)
Dado que este es el hit # 1 en google para este mensaje de error y hay una causa más sutil y probablemente común para él que los OP, estoy publicando este comentario aquí.
Este error también puede deberse al uso de un decorador de vista estándar en una vista de clase en lugar de __dispatch__
método __dispatch__
dentro de la vista.
He intentado por un tiempo hacer funcionar un ModelResource o una View usando el Django Rest Framework. Estoy siguiendo los ejemplos pero el código en los ejemplos no funciona para mí. ¿Alguien puede decirme por qué podría estar recibiendo este error?
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)),
)
Ahora obtengo el error ''objeto de función'' no tiene el atributo ''as_view''.
Para agregar al punto de Tim Saylor,
https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#id1
Para decorar cada instancia de una vista basada en clases, necesita decorar la definición de la clase en sí. Para hacer esto, aplica el decorador al método dispatch () de la clase.
Un método en una clase no es lo mismo que una función independiente, por lo que no puede aplicar un decorador de funciones al método; primero debe transformarlo en un decorador de métodos. El decorador method_decorator transforma un decorador de funciones en un decorador de métodos para que pueda usarse en un método de instancia. Por ejemplo:
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)
También recibo este error, pero en mi caso lo resolví con la siguiente idea.
Ese error suele ocurrir si intenta anular una clase. Eso sucede a veces si copias y pega el código y te olvidas de cambiar, por ejemplo, el nombre de la clase. Pero en mi caso fue un poco diferente
Si aplica @login_required
a una clase, recibirá el mensaje de error:
''function'' object has no attribute ''as_view''
Entonces, ¿cómo se deben decorar las clases en Django ahora? Para las vistas basadas en clases, tiene dos opciones para decorar sus clases.
1) Decorar el URLconf
2) Decorar la clase
Ambas opciones conducen al mismo resultado: restringir el acceso a una clase solo para usuarios registrados. La diferencia entre las opciones es cómo se aplica el decorador a la instancia de la clase. Consulte esta página para la implementación de decoradores.
https://docs.djangoproject.com/en/1.4/topics/class-based-views/#decorating-class-based-views
def TestView(View):
debería ser class TestView(View):
Tal como está, usted define una función llamada TestView
que toma un argumento llamado View
- su cuerpo define una función interna, luego devuelve None
.