Python:WTForms当我初始化一个字段时,我可以添加一个占位符属性吗?
我想添加一个占位符属性到WTForms中的字段。 我该怎么做?
abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], placeholder="test")
以上代码无效
我如何添加一个占位符属性值?
更新为WTForms 2.1
您现在可以从WTForms 2.1(2015年12月)中通过使用render_kw=
参数设置字段构造函数来设置呈现关键字。
所以这个领域看起来像:
abc = StringField('abc', [InputRequired()], render_kw={"placeholder": "test"})
请注意,这是可能的; 它开始桥接代码和表示之间的界限; 所以明智地使用它!
(旧的答案,对于早于WTForms 2.1的版本,仍然如此)
WTforms 2.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中定义的macros:
{% 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 %}
我的解决scheme是使用自定义小部件:
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并在表单代码中定义表单,而不是在模板中