[Django]-Django Rest Framework: 'function' object has no attribute 'as_view'

29👍

def TestView(View): should be class TestView(View):. As it stands, you define a function called TestView which takes an argument called View — its body defines an inner function, then returns None.

68👍

Since this is the #1 hit on google for this error message and there’s a more subtle and probably common cause for it than the OPs, I’m posting this comment here.

This error can also be caused by using a standard view decorator on a class based view instead of on the __dispatch__ method within the view.

29👍

To add to Tim Saylor point,

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

To decorate every instance of a class-based view, you need to decorate
the class definition itself. To do this you apply the decorator to the
dispatch() method of the class.

A method on a class isn’t quite the same as a standalone function, so
you can’t just apply a function decorator to the method – you need to
transform it into a method decorator first. The method_decorator
decorator transforms a function decorator into a method decorator so
that it can be used on an instance method. For example:

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)
👤venkat

9👍

I am also getting this error but in my case i solved it with following idea.

That error usually happens if you try to override a class. That sometimes happens if you copy&paste code and forget to change e.g. the class name. But in my case it was little different

If you apply @login_required to a class, you will receive the error message:

‘function’ object has no attribute ‘as_view’

So, how should you decorate classes in Django now?
For class-based views, you have two options of decorating your classes.

1) Decorating the URLconf

2) Decorating the class

Both options leads to the same result – restricting the access to a class only for logged users. The difference between the options is how the decorator is applied to the class instance.Refer this page for decorators implementation

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

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):

Leave a comment