Skip to content

Commit 1668010

Browse files
committed
Merge pull request #2743 from maurodoglio/serializer_class-html-renderer
Use `serializer_class` for browsable API display, even on plain APIView.
2 parents c9618cc + 77c44d8 commit 1668010

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

rest_framework/authtoken/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ class ObtainAuthToken(APIView):
1111
permission_classes = ()
1212
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
1313
renderer_classes = (renderers.JSONRenderer,)
14+
serializer_class = AuthTokenSerializer
1415

1516
def post(self, request):
16-
serializer = AuthTokenSerializer(data=request.data)
17+
serializer = self.serializer_class(data=request.data)
1718
serializer.is_valid(raise_exception=True)
1819
user = serializer.validated_data['user']
1920
token, created = Token.objects.get_or_create(user=user)

rest_framework/renderers.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,14 @@ def show_form_for_method(self, view, method, request, obj):
421421
return False # Doesn't have permissions
422422
return True
423423

424+
def _get_serializer(self, serializer_class, view_instance, request, *args, **kwargs):
425+
kwargs['context'] = {
426+
'request': request,
427+
'format': self.format,
428+
'view': view_instance
429+
}
430+
return serializer_class(*args, **kwargs)
431+
424432
def get_rendered_html_form(self, data, view, method, request):
425433
"""
426434
Return a string representing a rendered HTML form, possibly bound to
@@ -457,19 +465,31 @@ def get_rendered_html_form(self, data, view, method, request):
457465
if method in ('DELETE', 'OPTIONS'):
458466
return True # Don't actually need to return a form
459467

468+
has_serializer = getattr(view, 'get_serializer', None)
469+
has_serializer_class = getattr(view, 'serializer_class', None)
470+
460471
if (
461-
not getattr(view, 'get_serializer', None) or
472+
(not has_serializer and not has_serializer_class) or
462473
not any(is_form_media_type(parser.media_type) for parser in view.parser_classes)
463474
):
464475
return
465476

466477
if existing_serializer is not None:
467478
serializer = existing_serializer
468479
else:
469-
if method in ('PUT', 'PATCH'):
470-
serializer = view.get_serializer(instance=instance, **kwargs)
480+
if has_serializer:
481+
if method in ('PUT', 'PATCH'):
482+
serializer = view.get_serializer(instance=instance, **kwargs)
483+
else:
484+
serializer = view.get_serializer(**kwargs)
471485
else:
472-
serializer = view.get_serializer(**kwargs)
486+
# at this point we must have a serializer_class
487+
if method in ('PUT', 'PATCH'):
488+
serializer = self._get_serializer(view.serializer_class, view,
489+
request, instance=instance, **kwargs)
490+
else:
491+
serializer = self._get_serializer(view.serializer_class, view,
492+
request, **kwargs)
473493

474494
if hasattr(serializer, 'initial_data'):
475495
serializer.is_valid()

0 commit comments

Comments
 (0)