Python: WTForms могу ли я добавить атрибут-заполнитель при вводе поля?
Я хочу добавить атрибут-заполнитель в поле в WTForms. Как я могу это сделать?
abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], placeholder="test")
приведенный выше код не действует
Как я могу добавить атрибут placeholder со значением?
3 ответа:
обновлено для 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") }}
правильный ответ таков:
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-это макрос, определенный в формах.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'))
может быть, это не ellegant, но он позволяет использовать Flask-Bootstrap и определять ваши формы в коде форм, а не в шаблоне