Fixed #24229 -- Changed IntegerField to clean floats representing integers

This commit is contained in:
Jon Dufresne 2015-01-27 12:41:59 -08:00 committed by Claude Paroz
parent fa9cb5dcdc
commit 3b966c2b73
2 changed files with 20 additions and 1 deletions

View File

@ -236,6 +236,7 @@ class IntegerField(Field):
default_error_messages = { default_error_messages = {
'invalid': _('Enter a whole number.'), 'invalid': _('Enter a whole number.'),
} }
re_decimal = re.compile(r'\.0*\s*$')
def __init__(self, max_value=None, min_value=None, *args, **kwargs): def __init__(self, max_value=None, min_value=None, *args, **kwargs):
self.max_value, self.min_value = max_value, min_value self.max_value, self.min_value = max_value, min_value
@ -259,8 +260,9 @@ class IntegerField(Field):
return None return None
if self.localize: if self.localize:
value = formats.sanitize_separators(value) value = formats.sanitize_separators(value)
# Strip trailing decimal and zeros.
try: try:
value = int(str(value)) value = int(self.re_decimal.sub('', str(value)))
except (ValueError, TypeError): except (ValueError, TypeError):
raise ValidationError(self.error_messages['invalid'], code='invalid') raise ValidationError(self.error_messages['invalid'], code='invalid')
return value return value

View File

@ -247,6 +247,23 @@ class FieldsTests(SimpleTestCase):
f1 = IntegerField(localize=True) f1 = IntegerField(localize=True)
self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" />') self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" />')
def test_integerfield_float(self):
f = IntegerField()
self.assertEqual(1, f.clean(1.0))
self.assertEqual(1, f.clean('1.0'))
self.assertEqual(1, f.clean(b'1.0'))
self.assertEqual(1, f.clean(' 1.0 '))
self.assertEqual(1, f.clean('1.'))
self.assertEqual(1, f.clean(' 1. '))
self.assertRaisesMessage(ValidationError, "'Enter a whole number.'", f.clean, '1.5')
self.assertRaisesMessage(ValidationError, "'Enter a whole number.'", f.clean, '')
def test_integerfield_big_num(self):
f = IntegerField()
self.assertEqual(9223372036854775808, f.clean(9223372036854775808))
self.assertEqual(9223372036854775808, f.clean('9223372036854775808'))
self.assertEqual(9223372036854775808, f.clean('9223372036854775808.0'))
def test_integerfield_subclass(self): def test_integerfield_subclass(self):
""" """
Test that class-defined widget is not overwritten by __init__ (#22245). Test that class-defined widget is not overwritten by __init__ (#22245).