verrochio verrochio - 9 months ago 160
Python Question

Wtforms, add a class to a form dynamically

is there a way i could send a form's (css) class from python?
For example:

class Company(Form):
companyName = TextField('Company Name', [validators.Length(min=3, max = 60)])

This renders a simple text field, but i want that text field to have the css class of
, is that possible directly from python?

I know that i can put a
directly from python, but not class.


I tried
and it did not work, i got:

__init__() got an unexpected keyword argument '_class'


WTForms does not allow you to set display options (such as class name) in the field initialization. However, there are several ways to get around this:

  1. If all of your fields should include a class name as well as an ID then just pass in each field's short_name to it when you render it:

    {% for field in form %}
    {% endfor %}
  2. Create a custom widget mixin that provides the class name:

    from wtforms.fields import StringField
    from wtforms.widgets import TextInput
    class ClassedWidgetMixin(object):
        """Adds the field's name as a class 
        when subclassed with any WTForms Field type.
        Has not been tested - may not work."""
        def __init__(self, *args, **kwargs):
            super(ClassedWidgetMixin, self).__init__(*args, **kwargs)
        def __call__(self, field, **kwargs):
            c = kwargs.pop('class', '') or kwargs.pop('class_', '')
            kwargs['class'] = u'%s %s' % (field.short_name, c)
            return super(ClassedWidgetMixin, self).__call__(field, **kwargs)
    # An example
    class ClassedTextInput(ClassedWidgetMixin, TextInput):
    class Company(Form):
        company_name = StringField('Company Name', widget=ClassedTextInput)