mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-10 19:56:59 +03:00
Handle tuples same as lists in ValidationError detail context (#7647)
This commit is contained in:
parent
3db8877889
commit
19655edbf7
|
@ -20,7 +20,7 @@ def _get_error_details(data, default_code=None):
|
||||||
Descend into a nested data structure, forcing any
|
Descend into a nested data structure, forcing any
|
||||||
lazy translation strings or strings into `ErrorDetail`.
|
lazy translation strings or strings into `ErrorDetail`.
|
||||||
"""
|
"""
|
||||||
if isinstance(data, list):
|
if isinstance(data, (list, tuple)):
|
||||||
ret = [
|
ret = [
|
||||||
_get_error_details(item, default_code) for item in data
|
_get_error_details(item, default_code) for item in data
|
||||||
]
|
]
|
||||||
|
@ -150,7 +150,9 @@ class ValidationError(APIException):
|
||||||
|
|
||||||
# For validation failures, we may collect many errors together,
|
# For validation failures, we may collect many errors together,
|
||||||
# so the details should always be coerced to a list if not already.
|
# so the details should always be coerced to a list if not already.
|
||||||
if not isinstance(detail, dict) and not isinstance(detail, list):
|
if isinstance(detail, tuple):
|
||||||
|
detail = list(detail)
|
||||||
|
elif not isinstance(detail, dict) and not isinstance(detail, list):
|
||||||
detail = [detail]
|
detail = [detail]
|
||||||
|
|
||||||
self.detail = _get_error_details(detail, code)
|
self.detail = _get_error_details(detail, code)
|
||||||
|
|
|
@ -2,6 +2,7 @@ from django.test import TestCase
|
||||||
|
|
||||||
from rest_framework import serializers, status
|
from rest_framework import serializers, status
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
|
from rest_framework.exceptions import ValidationError
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
|
@ -99,3 +100,12 @@ class TestValidationErrorWithCodes(TestCase):
|
||||||
response = view(request)
|
response = view(request)
|
||||||
assert response.status_code == status.HTTP_400_BAD_REQUEST
|
assert response.status_code == status.HTTP_400_BAD_REQUEST
|
||||||
assert response.data == self.expected_response_data
|
assert response.data == self.expected_response_data
|
||||||
|
|
||||||
|
|
||||||
|
class TestValidationErrorConvertsTuplesToLists(TestCase):
|
||||||
|
def test_validation_error_details(self):
|
||||||
|
error = ValidationError(detail=('message1', 'message2'))
|
||||||
|
assert isinstance(error.detail, list)
|
||||||
|
assert len(error.detail) == 2
|
||||||
|
assert str(error.detail[0]) == 'message1'
|
||||||
|
assert str(error.detail[1]) == 'message2'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user