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 in cc3d24d7d5.
This commit is contained in:
yakimka 2021-07-15 21:27:59 +03:00 committed by Carlton Gibson
parent fd999318ad
commit c542d0a072
3 changed files with 15 additions and 2 deletions

View File

@ -349,6 +349,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:

View File

@ -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`).

View File

@ -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',