diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 0198f3e8c..4b49a7be2 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -567,6 +567,8 @@ class BrowsableAPIRenderer(BaseRenderer): if isinstance(field, serializers.HiddenField): data.pop(name, None) content = renderer.render(data, accepted, context) + # Renders returns bytes, but CharField expects a str. + content = content.decode('utf-8') else: content = None diff --git a/rest_framework/utils/mediatypes.py b/rest_framework/utils/mediatypes.py index 865c283cc..9fe3da05b 100644 --- a/rest_framework/utils/mediatypes.py +++ b/rest_framework/utils/mediatypes.py @@ -83,5 +83,5 @@ class _MediaType(object): def __str__(self): ret = "%s/%s" % (self.main_type, self.sub_type) for key, val in self.params.items(): - ret += "; %s=%s" % (key, val) + ret += "; %s=%s" % (key, val.decode('ascii')) return ret diff --git a/tests/test_negotiation.py b/tests/test_negotiation.py index b435b876a..7ce3f92a9 100644 --- a/tests/test_negotiation.py +++ b/tests/test_negotiation.py @@ -77,11 +77,7 @@ class TestAcceptedMediaType(TestCase): def test_mediatype_string_representation(self): mediatype = _MediaType('test/*; foo=bar') - params_str = '' - for key, val in mediatype.params.items(): - params_str += '; %s=%s' % (key, val) - expected = 'test/*' + params_str - assert str(mediatype) == expected + assert str(mediatype) == 'test/*; foo=bar' def test_raise_error_if_no_suitable_renderers_found(self): class MockRenderer(object): diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 57dc854de..9a2d033e8 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -676,7 +676,7 @@ class AdminRendererTests(TestCase): request = factory.get('/') response = view(request) response.render() - self.assertInHTML('