diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index f1305e850..12d72e9f7 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -202,6 +202,9 @@ def get_field_kwargs(field_name, model_field): isinstance(model_field, models.TextField) or isinstance(model_field, models.FileField)): kwargs['max_length'] = max_length + custom_message = model_field.error_messages.get("max_length", None) + if custom_message is not None: + kwargs.setdefault('error_messages', {}).update(max_length=custom_message) validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MaxLengthValidator) diff --git a/tests/test_validators.py b/tests/test_validators.py index a008cbc21..a71436b4f 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -2,8 +2,7 @@ import datetime import pytest from django.core.validators import ( - MaxLengthValidator, MaxValueValidator, MinLengthValidator, - MinValueValidator + MaxValueValidator, MinLengthValidator, MinValueValidator ) from django.db import DataError, models from django.test import TestCase @@ -648,10 +647,11 @@ class ValidatorMessageTests(TestCase): assert s.errors['text'] == ['This is too short.'] def test_max_length_validator_message_is_copied_from_model(self): - # Added this test because was expecting is_valid() to be false but it is not. - # Will investigate further class Post(models.Model): - text = models.CharField(max_length=100, validators=[MaxLengthValidator(limit_value=1, message='This is too long.')]) + text = models.CharField( + max_length=1, + error_messages={"max_length": "This is too long"} + ) class PostSerializer(serializers.ModelSerializer): class Meta: @@ -661,3 +661,4 @@ class ValidatorMessageTests(TestCase): data = {'text': 'A very long text'} s = PostSerializer(data=data) assert not s.is_valid() + assert s.errors['text'] == ['This is too long']