summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2018-03-14 11:28:18 -0400
committerTim Graham <timograham@gmail.com>2018-03-15 09:10:23 -0400
commit87dc0844a634360182bcb74d491508111ef8a652 (patch)
tree072b28c846356970202d7dd06a3c845b55ed24cb
parentfb8fd535c0f47cffb4da0c5900f3f66e1ec8d432 (diff)
Fixed #29200 -- Fixed label rendering when using RadioSelect and CheckboxSelectMultiple with MultiWidget.
-rw-r--r--django/forms/boundfield.py2
-rw-r--r--django/forms/jinja2/django/forms/widgets/input_option.html2
-rw-r--r--django/forms/templates/django/forms/widgets/input_option.html2
-rw-r--r--django/forms/widgets.py2
-rw-r--r--docs/releases/2.1.txt9
-rw-r--r--tests/forms_tests/widget_tests/test_radioselect.py15
-rw-r--r--tests/forms_tests/widget_tests/test_select.py5
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)