Opened 11 years ago
Closed 11 years ago
#20931 closed Bug (fixed)
RadioSelect, RadioSelectMultiple, CheckBoxSelect, CheckBoxSelectMultiple do not render nested option sets correctly
Reported by: | Dylan Verheul | Owned by: | Christopher Babiak |
---|---|---|---|
Component: | Forms | Version: | dev |
Severity: | Normal | Keywords: | choices |
Cc: | Carl Meyer | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The Select
widget is the default widget to handle fields that make use of choices
. These are commonly rendered as a HTML select
, as implemented for django.forms.widgets.Select
.
Sometimes a series of radio buttons or checkboxes is a better fir for the UI. Django supports this by implementing widgets that can stand in for Select
. These are RadioSelect
, RadioSelectMultiple
, CheckBoxSelect
, CheckBoxSelectMultiple
.
The choices to render are implemented as a n iterable of 2-tuples as documented here:
https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices
As stated in the documentation, choices
can be grouped for organizational purposes. The example given:
MEDIA_CHOICES = ( ('Audio', ( ('vinyl', 'Vinyl'), ('cd', 'CD'), ) ), ('Video', ( ('vhs', 'VHS Tape'), ('dvd', 'DVD'), ) ), ('unknown', 'Unknown'), )
When using a Select
or SelectMultiple
widget, these groups are rendered as HTML optgroup
elements. This is correct.
When using any of the other widgets mentioned, the organizational groups are not taken into account when rendering the widget. Instead, the entire group is forced to text without escaping, resulting in a single widget for each group, with the text representation of the list as its label (newlines and spaces added for better readability):
<label for="id_category3_0"> <input id="id_category3_0" name="category3" placeholder="Category3" title="" type="radio" value="Audio" /> (('vinyl', 'Vinyl'), ('cd', 'CD')) </label>
The solution for this would be take have the renders of these widgets mimic the behavior of Select.render_options
, but instead of optgroup
an extra level of ul
would have to be generated. In pseudo-HTML, for the given example:
<ul> <li> Audio <ul> <li>(input element for vinyl</li> <li>(input element for CD</li> </ul> </li> .... </ul>
Change History (7)
comment:1 by , 11 years ago
Triage Stage: | Unreviewed → Accepted |
---|---|
Version: | 1.5 → master |
comment:2 by , 11 years ago
Cc: | added |
---|
comment:3 by , 11 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:4 by , 11 years ago
Owner: | changed from | to
---|
comment:5 by , 11 years ago
comment:7 by , 11 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Cannot find a "RadioSelectMultiple" or "CheckBoxSelect" widget anywhere in Django. Keeping RadioSelect & CheckboxSelectMultiple, but ignoring those two.