aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/api-guide/versioning.md2
-rw-r--r--rest_framework/authtoken/serializers.py2
-rw-r--r--rest_framework/authtoken/views.py3
-rw-r--r--rest_framework/renderers.py28
-rw-r--r--rest_framework/static/rest_framework/js/default.js4
5 files changed, 33 insertions, 6 deletions
diff --git a/docs/api-guide/versioning.md b/docs/api-guide/versioning.md
index a227a4a3..846698fc 100644
--- a/docs/api-guide/versioning.md
+++ b/docs/api-guide/versioning.md
@@ -31,6 +31,8 @@ How you vary the API behavior is up to you, but one example you might typically
The `reverse` function included by REST framework ties in with the versioning scheme. You need to make sure to include the current `request` as a keyword argument, like so.
+ from rest_framework.reverse import reverse
+
reverse('bookings-list', request=request)
The above function will apply any URL transformations appropriate to the request version. For example:
diff --git a/rest_framework/authtoken/serializers.py b/rest_framework/authtoken/serializers.py
index 37ade255..597aeed2 100644
--- a/rest_framework/authtoken/serializers.py
+++ b/rest_framework/authtoken/serializers.py
@@ -6,7 +6,7 @@ from rest_framework import exceptions, serializers
class AuthTokenSerializer(serializers.Serializer):
username = serializers.CharField()
- password = serializers.CharField()
+ password = serializers.CharField(style={'input_type': 'password'})
def validate(self, attrs):
username = attrs.get('username')
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()
diff --git a/rest_framework/static/rest_framework/js/default.js b/rest_framework/static/rest_framework/js/default.js
index c8812132..22e5efde 100644
--- a/rest_framework/static/rest_framework/js/default.js
+++ b/rest_framework/static/rest_framework/js/default.js
@@ -45,6 +45,10 @@ var selectedTab = null;
var selectedTabName = getCookie('tabstyle');
if (selectedTabName) {
+ selectedTabName = selectedTabName.replace(/[^a-z-]/g, '');
+}
+
+if (selectedTabName) {
selectedTab = $('.form-switcher a[name=' + selectedTabName + ']');
}