wtform validator stringfield selectfield passwordfield python wtforms

python - validator - wtforms selectfield



Python: WTForms ¿Puedo agregar un atributo de marcador de posición cuando inicio un campo? (3)

La respuesta correcta es la siguiente:

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

Como se puede leer en la documentación:

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

Luego en tu plantilla:

{% import ''forms.html'' as forms %} {% for field in form %} {{ forms.render_field(field) }} {% endfor %}

Donde render_field es una macro que se define en 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 %}

Quiero agregar un atributo de marcador de posición en el campo en WTForms. ¿Cómo puedo hacerlo?

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

El código anterior no es válido.

¿Cómo puedo agregar un atributo de marcador de posición con valor?


Mi solución es usar un widget personalizado:

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''))

Tal vez no sea elegante, pero permite usar Flask-Bootstrap y definir sus formularios en el código de formularios, no en la plantilla.


Actualizado para WTForms 2.1

Ahora puede a partir de WTForms 2.1 (diciembre de 2015) configurar palabras clave de representación utilizando el parámetro render_kw= para el constructor de campo.

Entonces el campo se vería así:

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

Tenga en cuenta mientras esto es posible; comienza a tender un puente entre el código y la presentación; así que úsalo sabiamente!

(Respuesta anterior, todavía es cierto para versiones anteriores a WTForms 2.1)

placeholder no se admite en el constructor de Python en WTforms 2.0.xy a continuación.

Sin embargo, puedes hacerlo fácilmente en tu plantilla:

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