diff --git a/django/newforms/fields.py b/django/newforms/fields.py index e5556f5898..c18de0f35b 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -111,10 +111,11 @@ class CharField(Field): if value in EMPTY_VALUES: return u'' value = smart_unicode(value) - if self.max_length is not None and len(value) > self.max_length: - raise ValidationError(ugettext(u'Ensure this value has at most %d characters.') % self.max_length) - if self.min_length is not None and len(value) < self.min_length: - raise ValidationError(ugettext(u'Ensure this value has at least %d characters.') % self.min_length) + value_length = len(value) + if self.max_length is not None and value_length > self.max_length: + raise ValidationError(ugettext(u'Ensure this value has at most %d characters (it has %d).') % (self.max_length, value_length)) + if self.min_length is not None and value_length < self.min_length: + raise ValidationError(ugettext(u'Ensure this value has at least %d characters (it has %d).') % (self.min_length, value_length)) return value def widget_attrs(self, widget): diff --git a/tests/regressiontests/forms/localflavor.py b/tests/regressiontests/forms/localflavor.py index b52759a6e1..8cb096bd20 100644 --- a/tests/regressiontests/forms/localflavor.py +++ b/tests/regressiontests/forms/localflavor.py @@ -913,11 +913,11 @@ ValidationError: [u'This field requires only numbers.'] >>> f.clean('375.788.573-000') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 14 characters.'] +ValidationError: [u'Ensure this value has at most 14 characters (it has 15).'] >>> f.clean('123.456.78') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 11 characters.'] +ValidationError: [u'Ensure this value has at least 11 characters (it has 10).'] >>> f.clean('123456789555') Traceback (most recent call last): ... @@ -1208,11 +1208,11 @@ u'230880-3449' >>> f.clean('230880343') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 10 characters.'] +ValidationError: [u'Ensure this value has at least 10 characters (it has 9).'] >>> f.clean('230880343234') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 11 characters.'] +ValidationError: [u'Ensure this value has at most 11 characters (it has 12).'] >>> f.clean('abcdefghijk') Traceback (most recent call last): ... @@ -1254,18 +1254,18 @@ ValidationError: [u'Enter a valid value.'] >>> f.clean('123456') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 7 characters.'] +ValidationError: [u'Ensure this value has at least 7 characters (it has 6).'] >>> f.clean('123456555') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 8 characters.'] +ValidationError: [u'Ensure this value has at most 8 characters (it has 9).'] >>> f.clean('abcdefg') Traceback (most recent call last): ValidationError: [u'Enter a valid value.'] >>> f.clean(' 1234567 ') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 8 characters.'] +ValidationError: [u'Ensure this value has at most 8 characters (it has 9).'] >>> f.clean(' 12367 ') Traceback (most recent call last): ... diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index e612e6a943..28a5947eac 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -896,7 +896,7 @@ u'1234567890' >>> f.clean('1234567890a') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 10 characters.'] +ValidationError: [u'Ensure this value has at most 10 characters (it has 11).'] CharField accepts an optional min_length parameter: >>> f = CharField(min_length=10, required=False) @@ -905,7 +905,7 @@ u'' >>> f.clean('12345') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 10 characters.'] +ValidationError: [u'Ensure this value has at least 10 characters (it has 5).'] >>> f.clean('1234567890') u'1234567890' >>> f.clean('1234567890a') @@ -919,7 +919,7 @@ ValidationError: [u'This field is required.'] >>> f.clean('12345') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 10 characters.'] +ValidationError: [u'Ensure this value has at least 10 characters (it has 5).'] >>> f.clean('1234567890') u'1234567890' >>> f.clean('1234567890a') @@ -1443,11 +1443,11 @@ RegexField also access min_length and max_length parameters, for convenience. >>> f.clean('123') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 5 characters.'] +ValidationError: [u'Ensure this value has at least 5 characters (it has 3).'] >>> f.clean('abc') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 5 characters.'] +ValidationError: [u'Ensure this value has at least 5 characters (it has 3).'] >>> f.clean('12345') u'12345' >>> f.clean('1234567890') @@ -1455,7 +1455,7 @@ u'1234567890' >>> f.clean('12345678901') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 10 characters.'] +ValidationError: [u'Ensure this value has at most 10 characters (it has 11).'] >>> f.clean('12345a') Traceback (most recent call last): ... @@ -1512,13 +1512,13 @@ EmailField also access min_length and max_length parameters, for convenience. >>> f.clean('a@foo.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 10 characters.'] +ValidationError: [u'Ensure this value has at least 10 characters (it has 9).'] >>> f.clean('alf@foo.com') u'alf@foo.com' >>> f.clean('alf123456788@foo.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 15 characters.'] +ValidationError: [u'Ensure this value has at most 15 characters (it has 20).'] # URLField ################################################################## @@ -1622,13 +1622,13 @@ URLField also access min_length and max_length parameters, for convenience. >>> f.clean('http://f.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at least 15 characters.'] +ValidationError: [u'Ensure this value has at least 15 characters (it has 12).'] >>> f.clean('http://example.com') u'http://example.com' >>> f.clean('http://abcdefghijklmnopqrstuvwxyz.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 20 characters.'] +ValidationError: [u'Ensure this value has at most 20 characters (it has 37).'] # BooleanField ################################################################ @@ -1800,7 +1800,7 @@ u'test@example.com' >>> f.clean('longemailaddress@example.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 20 characters.'] +ValidationError: [u'Ensure this value has at most 20 characters (it has 28).'] >>> f.clean('not an e-mail') Traceback (most recent call last): ... @@ -1820,7 +1820,7 @@ u'test@example.com' >>> f.clean('longemailaddress@example.com') Traceback (most recent call last): ... -ValidationError: [u'Ensure this value has at most 20 characters.'] +ValidationError: [u'Ensure this value has at most 20 characters (it has 28).'] >>> f.clean('not an e-mail') Traceback (most recent call last): ... @@ -3271,7 +3271,7 @@ Case 2: POST with erroneous data (a redisplayed form, with errors).