2012-03-17 13 views

Respuesta

77

Actualizado para la WTForms 2.1

ahora como de WTForms 2.1 (Diciembre 2015) Puede configurar palabras clave renderizado mediante el parámetro render_kw= al constructor campo.

Así que el campo se vería así:

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

Nota si bien esto es posible; comienza a tender un puente entre el código y la presentación; ¡así que úsalo sabiamente!


(respuesta antiguo, sigue siendo cierto para las versiones mayores de WTForms 2,1)

placeholder no se admite en el constructor de Python en WTforms 2.0.x y por debajo.

Sin embargo, usted puede hacer esto fácilmente en su plantilla:

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

si tiene razón, el marcador de posición debe ser de estilo y no debe agregarse en los elementos estructurales. –

+0

Pero, ¿qué sucede si uso una macro y me llaman dentro de un bucle que recorre los campos de formulario? ¿Cómo puedo verificar dentro de la macro que un campo tiene atributos html adicionales? – Marconi

+10

Un marcador de posición es lo mismo que una etiqueta. Es, por lo tanto, contenido y no estilo. Establecerlo en una plantilla hace que sea imposible tener plantillas genéricas. – Milimetric

7

La respuesta correcta es la siguiente:

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

Como se puede leer en documenatation:

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

Entonces en su plantilla:

{% import 'forms.html' as forms %} 

{% for field in form %} 
    {{ forms.render_field(field) }} 
{% endfor %} 

Dónde 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 %} 
1

Mi solución es utilizar 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 es ellegant, pero permite utilizar Frasco -Bootstrap y defina sus formularios en el código de formularios, no en la plantilla

Cuestiones relacionadas