#32949 closed Bug (fixed)
decimal.InvalidOperation error on DecimalField form field
Reported by: | yakimka | Owned by: | yakimka |
---|---|---|---|
Component: | Forms | Version: | 3.2 |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I have a form with DecimalField and max_value argument:
class OrderForm(forms.ModelForm): sum = DecimalField(max_value=12) class Meta: model = Order fields = ['sum'] # model class Order(models.Model): sum = models.DecimalField( 'Sum', max_digits=18, decimal_places=2, default=0 )
If I pass "NaN" value to this form it will fail with decimal.InvalidOperation error.
Change History (8)
comment:1 by , 3 years ago
comment:2 by , 3 years ago
Needs documentation: | set |
---|---|
Patch needs improvement: | set |
Severity: | Normal → Release blocker |
Triage Stage: | Unreviewed → Accepted |
Thanks for the report.
This is a regression in cc3d24d7d577f174937a0744d886c4c7123cfa85.
The #7777 originally added handling of NaN
and Inf
in DecimalField
(in 692fd7da5e5bfe1533c40f94999ea42f9b986356).
It looked redundant but wasn't because MaxValueValidator
does not handle Decimal('NaN')
.
Here's a minimal diff showing that:
diff --git a/tests/validators/tests.py b/tests/validators/tests.py index e39d0e3a1c..42665c6ccb 100644 --- a/tests/validators/tests.py +++ b/tests/validators/tests.py @@ -214,6 +214,7 @@ TEST_DATA = [ (MaxValueValidator(0), 1, ValidationError), (MaxValueValidator(NOW), NOW + timedelta(days=1), ValidationError), + (MaxValueValidator(Decimal('NaN')), 1, ValidationError), (MinValueValidator(-10), -10, None), (MinValueValidator(-10), 10, None),
Results in:
====================================================================== ERROR: test_validators (validators.tests.TestValidators) [MaxValueValidator] (value=1) ---------------------------------------------------------------------- Traceback (most recent call last): File "...django/tests/validators/tests.py", line 355, in test_validators validator(value) File "...django/django/core/validators.py", line 358, in __call__ if self.compare(cleaned, limit_value): File "...django/django/core/validators.py", line 383, in compare return a > b decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
Your PR here should (partially?) revert cc3d24d7d577f174937a0744d886c4c7123cfa85 (see #31806 and the PR for discussion and related commits).
Add max_value
to the existing test_enter_a_numer_error()
case:
diff --git a/tests/forms_tests/field_tests/test_decimalfield.py b/tests/forms_tests/field_tests/test_decimalfield.py index c8b044722e..04c555c4ad 100644 --- a/tests/forms_tests/field_tests/test_decimalfield.py +++ b/tests/forms_tests/field_tests/test_decimalfield.py @@ -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 = (
It looks as if test test_value_placeholder_with_decimal_field (forms_tests.tests.test_validators.ValidatorCustomMessageTests)
will need adjusting.
A release note in 3.2.6.txt will be needed.
Good spot.
comment:3 by , 3 years ago
Needs documentation: | unset |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:4 by , 3 years ago
Patch needs improvement: | unset |
---|---|
Triage Stage: | Accepted → Ready for checkin |
PR