Skip to content

MultiWidget not rendering subfields with the correct classes #171

@73VW

Description

@73VW

Hello,

As the title suggests, when rendering a multiwidget, classes are not applied to the subwidgets.

The cause is the following:

In https://github.com/django-crispy-forms/crispy-tailwind/blob/main/crispy_tailwind/templatetags/tailwind_field.py, in the CrispyTailwindFieldNode.render method, we're iterating over the widgets but trying to get the css-class for the widgets of the field. This works fine when the field's widget has no subwidget (CharField, etc), but not for a MultiWidget.

        for widget, attr in zip(widgets, attrs):
...
            if template_pack == "tailwind" and '"class"' not in attr.keys():
                css_container = context.get("css_container", self.default_container)
                if css_container:
                    css = " " + css_container.get_input_class(field)
                    css_class += css

It's always the parent field which is passed to css_container.get_input_class.

in get_input_class, we get the name of the widget linked to the field:

    def get_input_class(self, field):
        widget_name = re.sub(r"widget$|input$", "", field.field.widget.__class__.__name__.lower())
        return getattr(self, widget_name, "")

widget_name will be equal to multi which, in turn does not return any css class for the subwidget.

I have found the workaround and will open a PR in the meantime so we can discuss it there.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions