diff options
| author | Tim Graham <timograham@gmail.com> | 2018-03-14 11:28:18 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-03-15 09:10:23 -0400 |
| commit | 87dc0844a634360182bcb74d491508111ef8a652 (patch) | |
| tree | 072b28c846356970202d7dd06a3c845b55ed24cb | |
| parent | fb8fd535c0f47cffb4da0c5900f3f66e1ec8d432 (diff) | |
Fixed #29200 -- Fixed label rendering when using RadioSelect and CheckboxSelectMultiple with MultiWidget.
| -rw-r--r-- | django/forms/boundfield.py | 2 | ||||
| -rw-r--r-- | django/forms/jinja2/django/forms/widgets/input_option.html | 2 | ||||
| -rw-r--r-- | django/forms/templates/django/forms/widgets/input_option.html | 2 | ||||
| -rw-r--r-- | django/forms/widgets.py | 2 | ||||
| -rw-r--r-- | docs/releases/2.1.txt | 9 | ||||
| -rw-r--r-- | tests/forms_tests/widget_tests/test_radioselect.py | 15 | ||||
| -rw-r--r-- | tests/forms_tests/widget_tests/test_select.py | 5 |
7 files changed, 32 insertions, 5 deletions
diff --git a/django/forms/boundfield.py b/django/forms/boundfield.py index d0ddd9715b..7f40fbbbb4 100644 --- a/django/forms/boundfield.py +++ b/django/forms/boundfield.py @@ -248,7 +248,7 @@ class BoundWidget: return self.tag(wrap_label=True) def tag(self, wrap_label=False): - context = {'widget': self.data, 'wrap_label': wrap_label} + context = {'widget': {**self.data, 'wrap_label': wrap_label}} return self.parent_widget._render(self.template_name, context, self.renderer) @property diff --git a/django/forms/jinja2/django/forms/widgets/input_option.html b/django/forms/jinja2/django/forms/widgets/input_option.html index 3f7085a4f0..48cd65b93a 100644 --- a/django/forms/jinja2/django/forms/widgets/input_option.html +++ b/django/forms/jinja2/django/forms/widgets/input_option.html @@ -1 +1 @@ -{% if wrap_label %}<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}>{% endif %}{% include "django/forms/widgets/input.html" %}{% if wrap_label %} {{ widget.label }}</label>{% endif %} +{% if widget.wrap_label %}<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}>{% endif %}{% include "django/forms/widgets/input.html" %}{% if widget.wrap_label %} {{ widget.label }}</label>{% endif %} diff --git a/django/forms/templates/django/forms/widgets/input_option.html b/django/forms/templates/django/forms/widgets/input_option.html index 3f7085a4f0..48cd65b93a 100644 --- a/django/forms/templates/django/forms/widgets/input_option.html +++ b/django/forms/templates/django/forms/widgets/input_option.html @@ -1 +1 @@ -{% if wrap_label %}<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}>{% endif %}{% include "django/forms/widgets/input.html" %}{% if wrap_label %} {{ widget.label }}</label>{% endif %} +{% if widget.wrap_label %}<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}>{% endif %}{% include "django/forms/widgets/input.html" %}{% if widget.wrap_label %} {{ widget.label }}</label>{% endif %} diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 50e41b59ec..566bdf25d6 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -621,12 +621,12 @@ class ChoiceWidget(Widget): 'attrs': option_attrs, 'type': self.input_type, 'template_name': self.option_template_name, + 'wrap_label': True, } def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs) - context['wrap_label'] = True return context def id_for_label(self, id_, index='0'): diff --git a/docs/releases/2.1.txt b/docs/releases/2.1.txt index b22f27dcd7..aa4c6b14a4 100644 --- a/docs/releases/2.1.txt +++ b/docs/releases/2.1.txt @@ -310,6 +310,15 @@ If you want to continue to allow those passwords to be used, you'll have to define the :setting:`PASSWORD_HASHERS` setting (if you don't already) and include ``'django.contrib.auth.hashers.BCryptPasswordHasher'``. +Moved ``wrap_label`` widget template context variable +----------------------------------------------------- + +To fix the lack of ``<label>`` when using ``RadioSelect`` and +``CheckboxSelectMultiple`` with ``MultiWidget``, the ``wrap_label`` context +variable now appears as an attribute of each option. For example, in a custom +``input_option.html`` template, change ``{% if wrap_label %}`` to +``{% if widget.wrap_label %}``. + Miscellaneous ------------- diff --git a/tests/forms_tests/widget_tests/test_radioselect.py b/tests/forms_tests/widget_tests/test_radioselect.py index d0a70c7953..0f85563a58 100644 --- a/tests/forms_tests/widget_tests/test_radioselect.py +++ b/tests/forms_tests/widget_tests/test_radioselect.py @@ -1,6 +1,6 @@ import datetime -from django.forms import RadioSelect +from django.forms import MultiWidget, RadioSelect from django.test import override_settings from .base import WidgetTest @@ -130,3 +130,16 @@ class RadioSelectTest(WidgetTest): </ul> """ self.check_html(self.widget(choices=choices), 'time', None, html=html) + + def test_render_as_subwidget(self): + """A RadioSelect as a subwidget of MultiWidget.""" + choices = (('', '------'),) + self.beatles + self.check_html(MultiWidget([self.widget(choices=choices)]), 'beatle', ['J'], html=( + """<ul> + <li><label><input type="radio" name="beatle_0" value=""> ------</label></li> + <li><label><input checked type="radio" name="beatle_0" value="J"> John</label></li> + <li><label><input type="radio" name="beatle_0" value="P"> Paul</label></li> + <li><label><input type="radio" name="beatle_0" value="G"> George</label></li> + <li><label><input type="radio" name="beatle_0" value="R"> Ringo</label></li> + </ul>""" + )) diff --git a/tests/forms_tests/widget_tests/test_select.py b/tests/forms_tests/widget_tests/test_select.py index beba21fe2d..42de5b6e92 100644 --- a/tests/forms_tests/widget_tests/test_select.py +++ b/tests/forms_tests/widget_tests/test_select.py @@ -294,6 +294,7 @@ class SelectTest(WidgetTest): 'template_name': 'django/forms/widgets/select_option.html', 'name': 'name', 'selected': False, + 'wrap_label': True, }, { 'value': 'cd', 'type': 'select', @@ -303,6 +304,7 @@ class SelectTest(WidgetTest): 'template_name': 'django/forms/widgets/select_option.html', 'name': 'name', 'selected': False, + 'wrap_label': True, }] ) self.assertEqual(index, 0) @@ -319,6 +321,7 @@ class SelectTest(WidgetTest): 'name': 'name', 'selected': True, 'type': 'select', + 'wrap_label': True, }, { 'value': 'dvd', 'template_name': 'django/forms/widgets/select_option.html', @@ -328,6 +331,7 @@ class SelectTest(WidgetTest): 'name': 'name', 'selected': False, 'type': 'select', + 'wrap_label': True, }] ) self.assertEqual(index, 1) @@ -344,6 +348,7 @@ class SelectTest(WidgetTest): 'index': '2', 'name': 'name', 'type': 'select', + 'wrap_label': True, }] ) self.assertEqual(index, 2) |
