Opened 3 years ago
Closed 3 years ago
#33445 closed New feature (needsinfo)
MultiWidget doesn't call subwidgets' render() methods.
Reported by: | Maxim Danilov | Owned by: | nobody |
---|---|---|---|
Component: | Forms | Version: | 4.0 |
Severity: | Normal | Keywords: | Forms, multiwidget, subwidget render. |
Cc: | Matthias Kestenholz, David Smith | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Subwidget don't rendered correctly in Miltiwidget, if Subwidget have own render method.
How i found it: In Multiwidget I use CKEditorWidget(forms.Textarea), whose have own render.
How to reproduce error:
Put MyWidget like a subwidget in multiwidget.
Class MyWidget(TextInput): def render(self, *args, **kwargs): print('hello world') return super().render(*args, **kwargs)
Nobody can see "Hello world" after Multiwidget render.
How i patch it - add subwidget.render call in context.
# in Multiwidget: def get_context(self, name, value, attrs): ... context['widget']['subwidgets'] = (self.rednder_subwidget(subwidget, **subwidget_context) for subwidget, subwidget_context in zip(self.widgets, context['widget']['subwidgets'])) ... # add @staticmethod def rednder_subwidget(subwidget, **kwargs): kwargs['render'] = lambda: mark_safe(subwidget.render(kwargs['name'], kwargs['value'], attrs=kwargs['attrs'], renderer=kwargs.get('renderer'))) return kwargs in multiwitget template: {% spaceless %}{% for widget in widget.subwidgets %}{{widget.render}}{% endfor %}{% endspaceless %}
Other possibility - write in documentation: MultiWidget works only with native Built-in Django widgets.
Change History (1)
comment:1 by , 3 years ago
Cc: | added |
---|---|
Easy pickings: | unset |
Has patch: | unset |
Resolution: | → needsinfo |
Status: | new → closed |
Summary: | subwidget don't rendered correctly in Miltiwidget, if subwidget have own render method. → MultiWidget doesn't call subwidgets' render() methods. |
Type: | Bug → New feature |
Note:
See TracTickets
for help on using tickets.
Thanks for this report, however it's not a bug, IMO.
MultiWidget
is also a normalWidget
and getting context for subwidgets (as documented) should be sufficient for rendering.render()
is a highly specialized method and I don't see why calling a customrender()
for subwidgets would be necessary. Also, as far as I'm aware CKEditorWidget doesn't have arender()
method.What's your use case?