Wtforms,动态地向表单添加类

ver*_*hio 19 css python flask wtforms

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

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

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

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

救命.

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

__init__() got an unexpected keyword argument '_class'
Run Code Online (Sandbox Code Playgroud)

por*_*ors 49

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

{{ form.name(size=20, class_='input-small') }}
Run Code Online (Sandbox Code Playgroud)

  • 如果有可能,我会投票十次,这是一个更好的解决方案.现在我可以坐下来观看WTForms摇滚~~~ (2认同)

Sea*_*ira 26

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

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

    <dl>
    {% for field in form %}
    <dt>{{field.label}}</dt>
    <dd>{{field(class_=field.short_name)}}</dd>
    {% endfor %}
    </dl>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个提供类名的自定义小部件 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)
    
    Run Code Online (Sandbox Code Playgroud)


imw*_*nxu 9

render_kw如果使用WTForms> = 2.1,请使用:

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