[3.2.x] Fixed #32949 -- Restored invalid number handling in DecimalField.validate().
DecimalField must itself validate() values, such as NaN, which cannot be passed to validators, such as MaxValueValidator, during the run_validators() phase. Regression incc3d24d7d5
. Backport ofc542d0a072
from main
This commit is contained in:
parent
05e997c404
commit
1346381760
|
@ -350,6 +350,17 @@ class DecimalField(IntegerField):
|
|||
raise ValidationError(self.error_messages['invalid'], code='invalid')
|
||||
return value
|
||||
|
||||
def validate(self, value):
|
||||
super().validate(value)
|
||||
if value in self.empty_values:
|
||||
return
|
||||
if not value.is_finite():
|
||||
raise ValidationError(
|
||||
self.error_messages['invalid'],
|
||||
code='invalid',
|
||||
params={'value': value},
|
||||
)
|
||||
|
||||
def widget_attrs(self, widget):
|
||||
attrs = super().widget_attrs(widget)
|
||||
if isinstance(widget, NumberInput) and 'step' not in widget.attrs:
|
||||
|
|
|
@ -9,4 +9,6 @@ Django 3.2.6 fixes several bugs in 3.2.5.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a regression in Django 3.2 that caused a crash validating ``"NaN"``
|
||||
input with a ``forms.DecimalField`` that had a specified ``max_value``
|
||||
(:ticket:`32949`).
|
||||
|
|
|
@ -49,7 +49,7 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
|
|||
self.assertIsNone(f.min_value)
|
||||
|
||||
def test_enter_a_number_error(self):
|
||||
f = DecimalField(max_digits=4, decimal_places=2)
|
||||
f = DecimalField(max_value=1, max_digits=4, decimal_places=2)
|
||||
values = (
|
||||
'-NaN', 'NaN', '+NaN',
|
||||
'-sNaN', 'sNaN', '+sNaN',
|
||||
|
|
Loading…
Reference in New Issue