def _render_field(self, field: BoundField, attrs: TypeAttrs = None) -> str: attrs = attrs or self._attrs_get_basic(self.attrs, field) placeholder = attrs.get('placeholder') if placeholder is None: if self.opt_placeholder_label: attrs['placeholder'] = field.label elif self.opt_placeholder_help: attrs['placeholder'] = field.help_text title = attrs.get('title') if title is None: title_label = self.opt_title_label title_help = self.opt_title_help if title_label or title_help: if title_label: attrs['title'] = field.label elif title_help: attrs['title'] = field.help_text out = field.as_widget(attrs=attrs) if field.field.show_hidden_initial: out += field.as_hidden(only_initial=True) return f'{out}'
def extract_widget_context(field: django_forms.BoundField) -> Dict[str, Any]: """ Previously we used a custom FormRenderer but there is *no way* to avoid the built in render method from piping this into `mark_safe`. So we monkeypatch the widget's internal renderer to return JSON directly without being wrapped by `mark_safe`. """ original_render = field.field.widget._render # type: ignore[union-attr] field.field.widget._render = ( # type: ignore[union-attr] lambda template_name, context, renderer: context) widget = field.as_widget() context: Any = widget["widget"] # type: ignore[index] context["template_name"] = getattr(field.field.widget, "reactivated_widget", context["template_name"]) # This is our first foray into properly serializing widgets using the # serialization framework. # # Eventually all widgets can be serialized this way and the frontend widget # types can disappear and be generated from the code here. # # We should not just handle optgroups but every property, and do so # recursively. def handle_optgroups(widget_context: Any) -> None: optgroups = widget_context.get("optgroups", None) if optgroups is not None: optgroup_schema = create_schema(Optgroup, {}) widget_context["optgroups"] = [ serialize(optgroup, optgroup_schema) for optgroup in optgroups ] for subwidget_context in context.get("subwidgets", []): handle_optgroups(subwidget_context) handle_optgroups(context) field.field.widget._render = original_render # type: ignore[union-attr] return context # type: ignore[no-any-return]
def class_attr(text: BoundField, args: str) -> BoundField: css_cls = ' '.join([c.strip() for c in args.split(',')]) return text.as_widget(attrs={'class':'{}'.format(css_cls)})