diff options
| author | Christopher Babiak <famousfilm@hotmail.com> | 2013-09-26 08:28:26 -0700 |
|---|---|---|
| committer | Julien Phalip <jphalip@gmail.com> | 2013-09-28 17:25:32 -0700 |
| commit | a834bc84d8c76d4a7016ac4db4f631a8bcaa3d0b (patch) | |
| tree | 03da95880324c1ba026807e87cdc38db905da08e /django/forms/widgets.py | |
| parent | 5866a49369cc6a4280b25a9d1834ceababf61d88 (diff) | |
Fixed #20931 -- Fixed select widgets nested choice rendering
ChoiceFieldRenderer was not rendering nested choices. Added recursion
to ChoiceFieldRenderer to take nested choices and render them as
<ul>'s.
Diffstat (limited to 'django/forms/widgets.py')
| -rw-r--r-- | django/forms/widgets.py | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 372c0f440b..f8320117f7 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -665,10 +665,6 @@ class ChoiceFieldRenderer(object): self.attrs = attrs self.choices = choices - def __iter__(self): - for i, choice in enumerate(self.choices): - yield self.choice_input_class(self.name, self.value, self.attrs.copy(), choice, i) - def __getitem__(self, idx): choice = self.choices[idx] # Let the IndexError propogate return self.choice_input_class(self.name, self.value, self.attrs.copy(), choice, idx) @@ -685,8 +681,23 @@ class ChoiceFieldRenderer(object): id_ = self.attrs.get('id', None) start_tag = format_html('<ul id="{0}">', id_) if id_ else '<ul>' output = [start_tag] - for widget in self: - output.append(format_html('<li>{0}</li>', force_text(widget))) + for i, choice in enumerate(self.choices): + choice_value, choice_label = choice + if isinstance(choice_label, (tuple,list)): + attrs_plus = self.attrs.copy() + if id_: + attrs_plus['id'] += '_{0}'.format(i) + sub_ul_renderer = ChoiceFieldRenderer(name=self.name, + value=self.value, + attrs=attrs_plus, + choices=choice_label) + sub_ul_renderer.choice_input_class = self.choice_input_class + output.append(format_html('<li>{0}{1}</li>', choice_value, + sub_ul_renderer.render())) + else: + w = self.choice_input_class(self.name, self.value, + self.attrs.copy(), choice, i) + output.append(format_html('<li>{0}</li>', force_text(w))) output.append('</ul>') return mark_safe('\n'.join(output)) |
