Wtforms, add a class to a form dynamically Wtforms, add a class to a form dynamically flask flask

Wtforms, add a class to a form dynamically


Alternatively you can add the class in your template like this for jinja2:

{{ form.name(size=20, class_='input-small') }}


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:

    <dl>{% for field in form %}<dt>{{field.label}}</dt><dd>{{field(class_=field.short_name)}}</dd>{% endfor %}</dl>
  2. Create a custom widget mixin that provides the class name:

    from wtforms.fields import StringFieldfrom wtforms.widgets import TextInputclass 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 exampleclass ClassedTextInput(ClassedWidgetMixin, TextInput):    passclass Company(Form):    company_name = StringField('Company Name', widget=ClassedTextInput)


Use render_kw if using WTForms >= 2.1 :

submit = SubmitField(u'Block Submit Buttom', render_kw={"class": "btn btn-primary btn-block"})