diff --git a/django/forms/widgets.py b/django/forms/widgets.py index c16c239de1..1ec17f4908 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -242,9 +242,16 @@ class MultipleHiddenInput(HiddenInput): def render(self, name, value, attrs=None, choices=()): if value is None: value = [] final_attrs = self.build_attrs(attrs, type=self.input_type, name=name) - return mark_safe(u'\n'.join([(u'' % - flatatt(dict(value=force_unicode(v), **final_attrs))) - for v in value])) + id_ = final_attrs.get('id', None) + inputs = [] + for i, v in enumerate(value): + input_attrs = dict(value=force_unicode(v), **final_attrs) + if id_: + # An ID attribute was given. Add a numeric index as a suffix + # so that the inputs don't all have the same ID attribute. + input_attrs['id'] = '%s_%s' % (id_, i) + inputs.append(u'' % flatatt(input_attrs)) + return mark_safe(u'\n'.join(inputs)) def value_from_datadict(self, data, files, name): if isinstance(data, (MultiValueDict, MergeDict)): diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py index 6ea9298d4c..d909c0f26c 100644 --- a/tests/regressiontests/forms/widgets.py +++ b/tests/regressiontests/forms/widgets.py @@ -183,6 +183,11 @@ u'' +Each input gets a separate ID. +>>> w = MultipleHiddenInput() +>>> w.render('letters', list('abc'), attrs={'id': 'hideme'}) +u'\n\n' + # FileInput Widget ############################################################ FileInput widgets don't ever show the value, because the old value is of no use @@ -1016,6 +1021,14 @@ True >>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]) u'' +# Each input gets a separate ID +>>> print CheckboxSelectMultiple().render('letters', list('ac'), choices=zip(list('abc'), list('ABC')), attrs={'id': 'abc'}) + + # MultiWidget ################################################################# >>> class MyMultiWidget(MultiWidget):