[Django] #31971: Would like a BooleanChoiceField in Forms

4 views
Skip to first unread message

Django

unread,
Sep 1, 2020, 9:16:04 AM9/1/20
to django-...@googlegroups.com
#31971: Would like a BooleanChoiceField in Forms
-------------------------------------+-------------------------------------
Reporter: | Owner: nobody
terencecollins |
Type: New | Status: new
feature |
Component: Forms | Version: 3.1
Severity: Normal | Keywords: boolean widget
| radioselect radio BooleanField
Triage Stage: | ChoiceField forms
Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
I am using a ChoiceField with a RadioSelect to provide an input to a
boolean field, however, the value in forms.cleaned_data comes through as a
string. I understand why a choice field would result in a string, however
if I place booleans in my values I'd expect them to pass simple equality
tests against booleans in the model. Other users implementing this model
will likely come up against a bug where False ≠ 'False'. So I'd request
a widget (BooleanChoiceField) to cover this case: often a simple checkbox
will not provide sufficient interface guidance to a user on the
implications of their true/false options.

{{{#!python
#in forms.py
class TimingForm(forms.ModelForm):

TIMING_LEVEL_CHOICES = ( (False, "Time Whole Lines (recommended)"),
(True, "Time Individual Words"), )

word_level_timing = forms.ChoiceField(label='Timing Level',
required=True, widget=forms.RadioSelect, choices=TIMING_LEVEL_CHOICES,
initial=False)
class Meta:
model = TimingThingie
fields = ['word_level_timing']

#in models.py
class TimingThingie(models.Model):
word_level_timing = models.BooleanField(default=False)

#in views.py:
def modify_timing(request, tinstance_id):
tinstance = TimingThingie.objects.get(id=tinstance_id)
if tinstance.word_level_timing !=
boolform.cleaned_data["word_level_timing"]:
#one is False, the other is 'False', inequality is true against
intent and likely introduces a bug
pass
if tinstance.word_level_timing !=
bool(strtobool(form.cleaned_data["word_level_timing"])):
#this works correctly, but is ugly and born only through suffering
pass
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/31971>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Sep 1, 2020, 9:20:06 AM9/1/20
to django-...@googlegroups.com
#31971: Would like a BooleanChoiceField in Forms
-------------------------------------+-------------------------------------
Reporter: Terence Collins | Owner: nobody
Type: New feature | Status: new
Component: Forms | Version: 3.1
Severity: Normal | Resolution:
Keywords: boolean widget | Triage Stage:
radioselect radio BooleanField | Unreviewed
ChoiceField forms |

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Terence Collins:

Old description:

New description:

form.cleaned_data["word_level_timing"]:
#one is False, the other is 'False', inequality is true against
intent and likely introduces a bug
pass
if tinstance.word_level_timing !=
bool(strtobool(form.cleaned_data["word_level_timing"])):
#this works correctly, but is ugly and born only through suffering
pass
}}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/31971#comment:1>

Django

unread,
Sep 2, 2020, 12:58:24 AM9/2/20
to django-...@googlegroups.com
#31971: Would like a BooleanChoiceField in Forms
-------------------------------------+-------------------------------------
Reporter: Terence Collins | Owner: nobody
Type: New feature | Status: closed
Component: Forms | Version: 3.1
Severity: Normal | Resolution: wontfix

Keywords: boolean widget | Triage Stage:
radioselect radio BooleanField | Unreviewed
ChoiceField forms |
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by felixxm):

* status: new => closed
* resolution: => wontfix


Comment:

You should use a `BooleanField` with a different widget not a
`ChoiceField`, if you want to get data as booleans, e.g.
{{{
word_level_timing =
forms.BooleanField(widget=forms.RadioSelect(choices=TIMING_LEVEL_CHOICES))
}}}

I don't see a reason to add a new field to Django.

--
Ticket URL: <https://code.djangoproject.com/ticket/31971#comment:2>

Reply all
Reply to author
Forward
0 new messages