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' ```