Python: WTForms Могу ли я добавить атрибут placeholder при инициализации поля?

Я хочу добавить атрибут placeholder в поле в WTForms. Как мне это сделать?

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

Вышеприведенный код недействителен

Как добавить атрибут placeholder со значением?

3 Solutions collect form web for “Python: WTForms Могу ли я добавить атрибут placeholder при инициализации поля?”

Обновлено для 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 – макрос, который определен в 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')) 

Возможно, это не ellegant, но это позволяет использовать Flask-Bootstrap и определять ваши формы в коде форм, а не в шаблоне

  • Как визуализировать теги в Flask / GAE?
  • рендеринг форм с флягой + wtform
  • Ошибка проверки формы из-за отсутствия CSRF
  • Я не могу импортировать Flask-WTF TextField и BooleanField
  • Flask-WTFform: Flash не отображает ошибки
  • Форма никогда не действует с WTForms
  • Как локализовать мой wtform?
  • Подтвердить форму WTForm на основе нажатой кнопки
  • Python - лучший язык программирования в мире.