diff options
| author | Max Arnold | 2012-07-12 22:40:24 +0700 |
|---|---|---|
| committer | Max Arnold | 2012-07-12 22:40:24 +0700 |
| commit | 36686cad13e7483699f224b16c9b7722c969f355 (patch) | |
| tree | 4fb25600ab2509141747e4773fb215d1b7577e2a | |
| parent | e53c819cc7a5567f2c29375550e9ff62ec20d472 (diff) | |
| download | django-rest-framework-36686cad13e7483699f224b16c9b7722c969f355.tar.bz2 | |
add View.head() method at runtime (should fix AttributeError: object has no attribute 'get')
| -rw-r--r-- | djangorestframework/compat.py | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/djangorestframework/compat.py b/djangorestframework/compat.py index 83d26f1f..11f24b86 100644 --- a/djangorestframework/compat.py +++ b/djangorestframework/compat.py @@ -68,12 +68,41 @@ except ImportError: # django.views.generic.View (Django >= 1.3) try: from django.views.generic import View + from django.utils.decorators import classonlymethod + from django.utils.functional import update_wrapper + if not hasattr(View, 'head'): # First implementation of Django class-based views did not include head method # in base View class - https://code.djangoproject.com/ticket/15668 class ViewPlusHead(View): - def head(self, request, *args, **kwargs): - return self.get(request, *args, **kwargs) + @classonlymethod + def as_view(cls, **initkwargs): + """ + Main entry point for a request-response process. + """ + # sanitize keyword arguments + for key in initkwargs: + if key in cls.http_method_names: + raise TypeError(u"You tried to pass in the %s method name as a " + u"keyword argument to %s(). Don't do that." + % (key, cls.__name__)) + if not hasattr(cls, key): + raise TypeError(u"%s() received an invalid keyword %r" % ( + cls.__name__, key)) + + def view(request, *args, **kwargs): + self = cls(**initkwargs) + if hasattr(self, 'get') and not hasattr(self, 'head'): + self.head = self.get + return self.dispatch(request, *args, **kwargs) + + # take name and docstring from class + update_wrapper(view, cls, updated=()) + + # and possible attributes set by decorators + # like csrf_exempt from dispatch + update_wrapper(view, cls.dispatch, assigned=()) + return view View = ViewPlusHead except ImportError: @@ -121,6 +150,8 @@ except ImportError: def view(request, *args, **kwargs): self = cls(**initkwargs) + if hasattr(self, 'get') and not hasattr(self, 'head'): + self.head = self.get return self.dispatch(request, *args, **kwargs) # take name and docstring from class |
