Wtforms,动态地向表单添加类

时间:2012-07-03 11:16:18

标签: python css flask wtforms

有没有办法从python发送一个表单(css)类? 例如:

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

这呈现了一个简单的文本字段,但我希望该文本字段具有.companyName的css类,是否可以直接从python中获取?

我知道我可以直接从python中放置id="companyName",但不能放入类。

帮助。

更新: 我试过class_="companyName"并且它没有用,我得到了:

__init__() got an unexpected keyword argument '_class'

4 个答案:

答案 0 :(得分:45)

或者,您可以在模板中添加类,如jinja2:

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

答案 1 :(得分:26)

WTForms不允许您在字段初始化中设置显示选项(例如类名)。但是,有几种方法可以解决这个问题:

  1. 如果您的所有字段都应包含类名和ID,那么在渲染时只需将每个字段的short_name传递给它:

    <dl>
    {% for field in form %}
    <dt>{{field.label}}</dt>
    <dd>{{field(class_=field.short_name)}}</dd>
    {% endfor %}
    </dl>
    
  2. 创建一个提供类名称的custom widget mixin:

    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)
    

答案 2 :(得分:7)

如果使用WTForms >= 2.1

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

答案 3 :(得分:0)

在您的模板中,尝试

{{ form.companyName( **{'class': 'companyName'} ) }}