Errors in browsable API on error. Closes #3024.

This commit is contained in:
Tom Christie 2015-07-23 14:31:25 +01:00
parent 6e6fa893e4
commit 90fe0fb881
3 changed files with 30 additions and 3 deletions

View File

@ -14,6 +14,7 @@ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext
from rest_framework import status
from rest_framework.utils.serializer_helpers import ReturnDict, ReturnList
def _force_text_recursive(data):
@ -22,14 +23,20 @@ def _force_text_recursive(data):
lazy translation strings into plain text.
"""
if isinstance(data, list):
return [
ret = [
_force_text_recursive(item) for item in data
]
if isinstance(data, ReturnList):
return ReturnList(ret, serializer=data.serializer)
return data
elif isinstance(data, dict):
return dict([
ret = dict([
(key, _force_text_recursive(value))
for key, value in data.items()
])
if isinstance(data, ReturnDict):
return ReturnDict(ret, serializer=data.serializer)
return data
return force_text(data)

View File

@ -204,7 +204,7 @@ class BaseSerializer(Field):
self._errors = {}
if self._errors and raise_exception:
raise ValidationError(self._errors)
raise ValidationError(self.errors)
return not bool(self._errors)

View File

@ -145,6 +145,16 @@ class TestRootView(TestCase):
created = self.objects.get(id=4)
self.assertEqual(created.text, 'foobar')
def test_post_error_root_view(self):
"""
POST requests to ListCreateAPIView in HTML should include a form error.
"""
data = {'text': 'foobar' * 100}
request = factory.post('/', data, HTTP_ACCEPT='text/html')
response = self.view(request).render()
expected_error = '<span class="help-block">Ensure this field has no more than 100 characters.</span>'
self.assertIn(expected_error, response.rendered_content)
EXPECTED_QUERIES_FOR_PUT = 3 if django.VERSION < (1, 6) else 2
@ -282,6 +292,16 @@ class TestInstanceView(TestCase):
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertFalse(self.objects.filter(id=999).exists())
def test_put_error_instance_view(self):
"""
Incorrect PUT requests in HTML should include a form error.
"""
data = {'text': 'foobar' * 100}
request = factory.put('/', data, HTTP_ACCEPT='text/html')
response = self.view(request, pk=1).render()
expected_error = '<span class="help-block">Ensure this field has no more than 100 characters.</span>'
self.assertIn(expected_error, response.rendered_content)
class TestFKInstanceView(TestCase):
def setUp(self):