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") }}