Wtforms, add a class to a form dynamically

css, flask, python, wtforms

Solution

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:

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:

<dl>
{% for field in form %}
<dt>{{field.label}}</dt>
<dd>{{field(class_=field.short_name)}}</dd>
{% endfor %}
</dl>

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):
    pass

class Company(Form):
    company_name = StringField('Company Name', widget=ClassedTextInput)

Problem

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 `.companyName`, is that possible directly from python? I know that i can put a `id="companyName"` directly from python, but not class. Help. Update: I tried `class_="companyName"` and it did not work, i got: ``` __init__() got an unexpected keyword argument '_class' ```

Original source