mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-10 19:56:59 +03:00
Errors in browsable API on error. Closes #3024.
This commit is contained in:
parent
6e6fa893e4
commit
90fe0fb881
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue
Block a user