#35126: forms.NullBooleanField's validation logic is surprising
----------------------------------------+------------------------
Reporter: Jeremy Lainé | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 5.0
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
----------------------------------------+------------------------
Reading NullBooleanField's code lead me to believe that it would clean
`"1"` to `True`, and `"0"` to `False`", just like `BooleanField` does:
https://github.com/django/django/blob/10c7c7320baf1c655fcb91202169d77725c9c4bd/django/forms/fields.py#L850
A simple field-level test works:
{{{
>>> from django import forms
>>> field = forms.NullBooleanField()
>>> field.clean("1")
True
>>> field.clean("0")
False
}}}
But using this in an actual form fails, not the difference between the
`BooleanField` and `NullBooleanField`:
{{{
>>> class DemoForm(forms.Form):
... field_a = forms.BooleanField()
... field_b = forms.NullBooleanField()
...
>>> form = DemoForm({"field_a": "1", "field_b": "1"})
>>> form.is_valid()
>>> form.cleaned_data
{'field_a': True, 'field_b': None}
}}}
The problem is that by default `NullBooleanField` uses a
`NullBooleanSelect` which mangles the submitted data for some obscure
backwards-compatibility reason:
https://github.com/django/django/blob/10c7c7320baf1c655fcb91202169d77725c9c4bd/django/forms/widgets.py#L816
--
Ticket URL: <https://code.djangoproject.com/ticket/35126>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018d1d152cd9-29ea9154-797c-4d61-9a73-5ffa7190e56e-000000%40eu-central-1.amazonses.com.