mirror of https://github.com/django/django.git
Fixed #24229 -- Changed IntegerField to clean floats representing integers
This commit is contained in:
parent
fa9cb5dcdc
commit
3b966c2b73
|
@ -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
|
||||||
|
|
|
@ -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).
|
||||||
|
|
Loading…
Reference in New Issue