diff options
| author | Tom Christie | 2013-06-03 00:49:02 -0700 |
|---|---|---|
| committer | Tom Christie | 2013-06-03 00:49:02 -0700 |
| commit | 62e59f8277afdde2e35185391d8e805c4f16cf22 (patch) | |
| tree | c20bdf0a6427778ec71d7e9fb73ca5b16c243482 | |
| parent | b10869a08b4effac9b8df1d776e6ffb882a1a742 (diff) | |
| parent | c176af35e5ad18e8aced7156af7f4791e8f23ca2 (diff) | |
| download | django-rest-framework-62e59f8277afdde2e35185391d8e805c4f16cf22.tar.bz2 | |
Merge pull request #900 from copitux/fix-validation-layer
Bugfix: Fix run validation layer with invalid data
| -rw-r--r-- | rest_framework/serializers.py | 3 | ||||
| -rw-r--r-- | rest_framework/tests/test_validation.py | 22 |
2 files changed, 24 insertions, 1 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index a4969f60..11ead02e 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -315,7 +315,8 @@ class BaseSerializer(WritableField): self._errors = {} if data is not None or files is not None: attrs = self.restore_fields(data, files) - attrs = self.perform_validation(attrs) + if attrs is not None: + attrs = self.perform_validation(attrs) else: self._errors['non_field_errors'] = ['No input provided'] diff --git a/rest_framework/tests/test_validation.py b/rest_framework/tests/test_validation.py index cbdd6515..a6ec0e99 100644 --- a/rest_framework/tests/test_validation.py +++ b/rest_framework/tests/test_validation.py @@ -63,3 +63,25 @@ class TestPreSaveValidationExclusions(TestCase): # does not have `blank=True`, so this serializer should not validate. serializer = ShouldValidateModelSerializer(data={'renamed': ''}) self.assertEqual(serializer.is_valid(), False) + + +class ValidationSerializer(serializers.Serializer): + foo = serializers.CharField() + + def validate_foo(self, attrs, source): + raise serializers.ValidationError("foo invalid") + + def validate(self, attrs): + raise serializers.ValidationError("serializer invalid") + + +class TestAvoidValidation(TestCase): + """ + If serializer was initialized with invalid data (None or non dict-like), it + should avoid validation layer (validate_<field> and validate methods) + """ + def test_serializer_errors_has_only_invalid_data_error(self): + serializer = ValidationSerializer(data='invalid data') + self.assertFalse(serializer.is_valid()) + self.assertDictEqual(serializer.errors, + {'non_field_errors': ['Invalid data']}) |
