aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2015-03-23 09:43:39 +0000
committerTom Christie2015-03-23 09:43:39 +0000
commit166801063d6d8bf70d549866da7f718c90927965 (patch)
treefe04879e89c72c848e27bcc1c19495e1ba421bb6 /rest_framework
parentc9618cc0f33bec0e14c814e778727c084410badb (diff)
parent77c44d8c63eac49201351dfc2d4b625f872bcb75 (diff)
downloaddjango-rest-framework-166801063d6d8bf70d549866da7f718c90927965.tar.bz2
Merge pull request #2743 from maurodoglio/serializer_class-html-renderer
Use `serializer_class` for browsable API display, even on plain APIView.
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/authtoken/views.py3
-rw-r--r--rest_framework/renderers.py28
2 files changed, 26 insertions, 5 deletions
diff --git a/rest_framework/authtoken/views.py b/rest_framework/authtoken/views.py
index b75c2e25..66bbc49b 100644
--- a/rest_framework/authtoken/views.py
+++ b/rest_framework/authtoken/views.py
@@ -11,9 +11,10 @@ class ObtainAuthToken(APIView):
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
+ serializer_class = AuthTokenSerializer
def post(self, request):
- serializer = AuthTokenSerializer(data=request.data)
+ serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py
index 920d2bc4..2350344c 100644
--- a/rest_framework/renderers.py
+++ b/rest_framework/renderers.py
@@ -421,6 +421,14 @@ class BrowsableAPIRenderer(BaseRenderer):
return False # Doesn't have permissions
return True
+ def _get_serializer(self, serializer_class, view_instance, request, *args, **kwargs):
+ kwargs['context'] = {
+ 'request': request,
+ 'format': self.format,
+ 'view': view_instance
+ }
+ return serializer_class(*args, **kwargs)
+
def get_rendered_html_form(self, data, view, method, request):
"""
Return a string representing a rendered HTML form, possibly bound to
@@ -457,8 +465,11 @@ class BrowsableAPIRenderer(BaseRenderer):
if method in ('DELETE', 'OPTIONS'):
return True # Don't actually need to return a form
+ has_serializer = getattr(view, 'get_serializer', None)
+ has_serializer_class = getattr(view, 'serializer_class', None)
+
if (
- not getattr(view, 'get_serializer', None) or
+ (not has_serializer and not has_serializer_class) or
not any(is_form_media_type(parser.media_type) for parser in view.parser_classes)
):
return
@@ -466,10 +477,19 @@ class BrowsableAPIRenderer(BaseRenderer):
if existing_serializer is not None:
serializer = existing_serializer
else:
- if method in ('PUT', 'PATCH'):
- serializer = view.get_serializer(instance=instance, **kwargs)
+ if has_serializer:
+ if method in ('PUT', 'PATCH'):
+ serializer = view.get_serializer(instance=instance, **kwargs)
+ else:
+ serializer = view.get_serializer(**kwargs)
else:
- serializer = view.get_serializer(**kwargs)
+ # at this point we must have a serializer_class
+ if method in ('PUT', 'PATCH'):
+ serializer = self._get_serializer(view.serializer_class, view,
+ request, instance=instance, **kwargs)
+ else:
+ serializer = self._get_serializer(view.serializer_class, view,
+ request, **kwargs)
if hasattr(serializer, 'initial_data'):
serializer.is_valid()