From 2a0ac4c80fcd96d1cabb4e4378910ee3c96959b3 Mon Sep 17 00:00:00 2001 From: John Downs Date: Tue, 14 Nov 2017 14:10:59 -0500 Subject: [PATCH 1/2] fields should respect error messages on the parent field --- rest_framework/serializers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 67cf432e0..1d67a03af 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -900,6 +900,9 @@ class ModelSerializer(Serializer): if model_field.help_text is not None: kwargs['help_text'] = model_field.help_text + if model_field.error_messages is not None: + kwargs['error_messages'] = model.error_messages + # TODO: TypedChoiceField? if model_field.flatchoices: # This ModelField contains choices kwargs['choices'] = model_field.flatchoices From ad1d375e54817e68763e868ee62bb581b9113ede Mon Sep 17 00:00:00 2001 From: John Downs Date: Tue, 14 Nov 2017 14:28:25 -0500 Subject: [PATCH 2/2] test for propagating error_messages --- rest_framework/serializers.py | 2 +- tests/test_serializer.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 1d67a03af..d4d6461da 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -901,7 +901,7 @@ class ModelSerializer(Serializer): kwargs['help_text'] = model_field.help_text if model_field.error_messages is not None: - kwargs['error_messages'] = model.error_messages + kwargs['error_messages'] = model_field.error_messages # TODO: TypedChoiceField? if model_field.flatchoices: # This ModelField contains choices diff --git a/tests/test_serializer.py b/tests/test_serializer.py index e72b723f0..e2e1b6a01 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -1344,7 +1344,8 @@ class SeveralChoicesModel(models.Model): max_length=10, choices=[('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')], blank=True, - default='metal' + default='metal', + error_messages={'invalid_choice': 'The choice %(value)s is invalid. Please choose one of ["rock", "metal", "grunge"]'} ) @@ -1388,6 +1389,13 @@ class SerializerChoiceFields(TestCase): BLANK_CHOICE_DASH + [('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')] ) + def test_field_propagates_error_messages(self): + data = {'color': 'blue', 'music_genre': 'grindcore'} + serializer = self.several_choices_serializer(data=data) + self.assertFalse(serializer.is_valid()) + expected_errors = {'music_genre': ['The choice grindcore is invalid. Please choose one of ["rock", "metal", "grunge"]']} + self.assertEqual(serializer.errors, expected_errors) + # Regression tests for #675 class Ticket(models.Model):