Fixed #3312 -- CheckboxSelectMultiple no longer uses duplicate ID attributes for each checkbox
git-svn-id: http://code.djangoproject.com/svn/django/trunk@4436 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
982a9443e1
commit
c0e01416b6
|
@ -258,11 +258,16 @@ class RadioSelect(Select):
|
||||||
class CheckboxSelectMultiple(SelectMultiple):
|
class CheckboxSelectMultiple(SelectMultiple):
|
||||||
def render(self, name, value, attrs=None, choices=()):
|
def render(self, name, value, attrs=None, choices=()):
|
||||||
if value is None: value = []
|
if value is None: value = []
|
||||||
|
has_id = attrs and attrs.has_key('id')
|
||||||
final_attrs = self.build_attrs(attrs, name=name)
|
final_attrs = self.build_attrs(attrs, name=name)
|
||||||
output = [u'<ul>']
|
output = [u'<ul>']
|
||||||
str_values = set([smart_unicode(v) for v in value]) # Normalize to strings.
|
str_values = set([smart_unicode(v) for v in value]) # Normalize to strings.
|
||||||
|
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)
|
cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
|
||||||
for option_value, option_label in chain(self.choices, choices):
|
|
||||||
option_value = smart_unicode(option_value)
|
option_value = smart_unicode(option_value)
|
||||||
rendered_cb = cb.render(name, 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))))
|
output.append(u'<li><label>%s %s</label></li>' % (rendered_cb, escape(smart_unicode(option_label))))
|
||||||
|
|
|
@ -2149,6 +2149,16 @@ MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
|
||||||
<li><label><input checked="checked" type="checkbox" name="composers" value="P" /> Paul McCartney</label></li>
|
<li><label><input checked="checked" type="checkbox" name="composers" value="P" /> Paul McCartney</label></li>
|
||||||
</ul>
|
</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
|
Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict
|
||||||
conveniently work with this.
|
conveniently work with this.
|
||||||
>>> data = {'name': 'Yesterday', 'composers': ['J', 'P']}
|
>>> data = {'name': 'Yesterday', 'composers': ['J', 'P']}
|
||||||
|
|
Loading…
Reference in New Issue