Python: WTForms Могу ли я добавить атрибут placeholder при инициализации поля?
Я хочу добавить атрибут placeholder в поле в WTForms. Как я могу это сделать?
abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], placeholder="test")
Вышеприведенный код недействителен
Как добавить атрибут placeholder со значением?
Ответы
Ответ 1
Обновлено для WTForms 2.1
Теперь, когда WTForms 2.1 (декабрь 2015 г.) устанавливает ключевые слова рендеринга, используя параметр render_kw=
для конструктора полей.
Итак, поле будет выглядеть так:
abc = StringField('abc', [InputRequired()], render_kw={"placeholder": "test"})
Обратите внимание, что это возможно; он начинает мостить границу между кодом и презентацией; поэтому используйте его с умом!
(Старый ответ, по-прежнему верен для версий старше WTForms 2.1)
placeholder
не поддерживается в конструкторе Python в WTforms 2.0.x и ниже.
Однако вы можете сделать это легко в своем шаблоне:
{{ form.abc(placeholder="test") }}
Ответ 2
Правильный ответ выглядит следующим образом:
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 %}
Ответ 3
Мое решение использует пользовательский виджет:
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'))
Может быть, это не ellegant, но он позволяет использовать Flask-Bootstrap и определять ваши формы в коде форм, а не в шаблоне