当初始化一个字段时,我可以添加一个占位符属性吗?

我想在 WTForms 中的字段中添加一个占位符属性?

abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], placeholder="test")

以上代码无效

如何添加带有值的占位符属性?

54093 次浏览

更新 WTForms2.1

从 WTForms 2.1(2015年12月)开始,您可以通过使用字段构造函数的 render_kw=参数来设置呈现关键字。

因此这个领域看起来像:

abc = StringField('abc', [InputRequired()], render_kw={"placeholder": "test"})

注意,这是可能的; 它确实开始在代码和表示之间架起桥梁; 所以要明智地使用它!


(旧的答案,对于 WTForms 2.1以前的版本仍然适用)

WTforms2.0.x 及以下版本的 Python 构造函数不支持 placeholder

然而,你可以很容易地在你的模板中做到这一点:

\{\{ form.abc(placeholder="test") }}

正确答案如下:

abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], description="test")

正如我们可以从文献中读到的:

description – A description for the field, typically used for help text.

然后在你的模板中:

{% import 'forms.html' as forms %}


{% for field in form %}
\{\{ forms.render_field(field) }}
{% endfor %}

其中 render _ field 是在 forms.html 中定义的宏:

{% macro render_field(field) -%}


{% if field.type == 'CSRFTokenField' %}
\{\{ field }}


{% if field.errors %}
<div class="warning">You have submitted an invalid CSRF token</div>
{% endif %}
{% elif field.type == 'HiddenField' %}
\{\{ field }}
{# any other special case you may need #}
{% else %}
<div class="form-group">
<label for="\{\{ field.label.field_id }}" class="col-sm-2 control-label">\{\{ field.label.text }}</label>
<div class="col-sm-10">
\{\{ field(placeholder=field.description) }}
{% if field.errors %}
<div class="alert alert-danger" role="alert">
{% for err in field.errors %}
<p>\{\{ err|e }}</p>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{% endif %}


{%- endmacro %}

我的解决方案是使用一个自定义小部件:

from flask.ext.wtf import Form
from wtforms import StringField, validators
from wtforms.widgets import Input




class CustomInput(Input):
input_type = None


def __init__(self, input_type=None, **kwargs):
self.params = kwargs
super(CustomInput, self).__init__(input_type=input_type)


def __call__(self, field, **kwargs):
for param, value in self.params.iteritems():
kwargs.setdefault(param, value)
return super(CustomInput, self).__call__(field, **kwargs)




class CustomTextInput(CustomInput):
input_type = 'text'




class EditProfileForm(Form):
first_name = StringField('First name',
validators=[validators.DataRequired()],
widget=CustomTextInput(placeholder='Enter first name'))

也许它并不优雅,但它允许使用 Flask-Bootstrap 并在表单代码中定义表单,而不是在模板中

\{\{ form.username(class="input", placeholder="Please enter your username") }}