Author: adrian
Date: 2007-01-27 15:41:32 -0600 (Sat, 27 Jan 2007)
New Revision: 4436

Modified:
   django/trunk/django/newforms/widgets.py
   django/trunk/tests/regressiontests/forms/tests.py
Log:
Fixed #3312 -- CheckboxSelectMultiple no longer uses duplicate ID attributes 
for each checkbox

Modified: django/trunk/django/newforms/widgets.py
===================================================================
--- django/trunk/django/newforms/widgets.py     2007-01-27 21:30:26 UTC (rev 
4435)
+++ django/trunk/django/newforms/widgets.py     2007-01-27 21:41:32 UTC (rev 
4436)
@@ -258,11 +258,16 @@
 class CheckboxSelectMultiple(SelectMultiple):
     def render(self, name, value, attrs=None, choices=()):
         if value is None: value = []
+        has_id = attrs and attrs.has_key('id')
         final_attrs = self.build_attrs(attrs, name=name)
         output = [u'<ul>']
         str_values = set([smart_unicode(v) for v in value]) # Normalize to 
strings.
-        cb = CheckboxInput(final_attrs, check_test=lambda value: value in 
str_values)
-        for option_value, option_label in chain(self.choices, choices):
+        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))
+            cb = CheckboxInput(final_attrs, check_test=lambda value: value in 
str_values)
             option_value = smart_unicode(option_value)
             rendered_cb = cb.render(name, option_value)
             output.append(u'<li><label>%s %s</label></li>' % (rendered_cb, 
escape(smart_unicode(option_label))))

Modified: django/trunk/tests/regressiontests/forms/tests.py
===================================================================
--- django/trunk/tests/regressiontests/forms/tests.py   2007-01-27 21:30:26 UTC 
(rev 4435)
+++ django/trunk/tests/regressiontests/forms/tests.py   2007-01-27 21:41:32 UTC 
(rev 4436)
@@ -2149,6 +2149,16 @@
 <li><label><input checked="checked" type="checkbox" name="composers" value="P" 
/> Paul McCartney</label></li>
 </ul>
 
+Regarding auto_id, CheckboxSelectMultiple is a special case. Each checkbox
+gets a distinct ID, formed by appending an underscore plus the checkbox's
+zero-based index.
+>>> f = SongForm(auto_id='%s_id')
+>>> print f['composers']
+<ul>
+<li><label><input type="checkbox" name="composers" value="J" 
id="composers_id_0" /> John Lennon</label></li>
+<li><label><input type="checkbox" name="composers" value="P" 
id="composers_id_1" /> Paul McCartney</label></li>
+</ul>
+
 Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict
 conveniently work with this.
 >>> data = {'name': 'Yesterday', 'composers': ['J', 'P']}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to