summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Raucy <lraucy@multiposting.fr>2013-01-09 10:07:44 +0100
committerPreston Holmes <preston@ptone.com>2013-01-09 16:06:56 -0800
commit62f842e2e568c87387e3da3ab76600bd0aab3e95 (patch)
tree38f2898366966d69d74b0106a07c4cbcffb5f6ab
parent227bd3f8dbcedb4d90cf5474bc237ca4bd46d49d (diff)
Fixed #19581 -- ensure unique html ids with CheckboxSelectMultiple widgets
ID check is now done the same way as MultipleHiddenInput.
-rw-r--r--django/forms/widgets.py8
-rw-r--r--tests/regressiontests/forms/tests/widgets.py7
2 files changed, 11 insertions, 4 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 4782b99117..d6ea56f0c8 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -754,17 +754,17 @@ class RadioSelect(Select):
class CheckboxSelectMultiple(SelectMultiple):
def render(self, name, value, attrs=None, choices=()):
if value is None: value = []
- has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
+ id_ = final_attrs.get('id', None)
output = ['<ul>']
# Normalize to strings
str_values = set([force_text(v) for v in value])
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
- if has_id:
- final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
- label_for = format_html(' for="{0}"', final_attrs['id'])
+ if id_:
+ final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
+ label_for = format_html(' for="{0}_{1}"', id_, i)
else:
label_for = ''
diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py
index f9dc4a7ec8..7a2961358a 100644
--- a/tests/regressiontests/forms/tests/widgets.py
+++ b/tests/regressiontests/forms/tests/widgets.py
@@ -863,6 +863,13 @@ beatle J R Ringo False""")
<li><label for="abc_2"><input checked="checked" type="checkbox" name="letters" value="c" id="abc_2" /> C</label></li>
</ul>""")
+ # Each input gets a separate ID when the ID is passed to the constructor
+ self.assertHTMLEqual(CheckboxSelectMultiple(attrs={'id': 'abc'}).render('letters', list('ac'), choices=zip(list('abc'), list('ABC'))), """<ul>
+<li><label for="abc_0"><input checked="checked" type="checkbox" name="letters" value="a" id="abc_0" /> A</label></li>
+<li><label for="abc_1"><input type="checkbox" name="letters" value="b" id="abc_1" /> B</label></li>
+<li><label for="abc_2"><input checked="checked" type="checkbox" name="letters" value="c" id="abc_2" /> C</label></li>
+</ul>""")
+
def test_multi(self):
class MyMultiWidget(MultiWidget):
def decompress(self, value):