diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 67cf432e0..d4d6461da 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_field.error_messages + # TODO: TypedChoiceField? if model_field.flatchoices: # This ModelField contains choices kwargs['choices'] = model_field.flatchoices 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):