2012-08-23 25 views
25

Al intentar establecer el valor predeterminado de un SelectField con WTForms, transfiero el valor al parámetro 'default' de ese modo.¿Cómo se establece un valor predeterminado para un WTForms SelectField?

class TestForm(Form): 
    test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=2) 

He intentado lo siguiente.

class TestForm(Form): 
    test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=(2, "Def")) 

Ninguno establece el campo seleccionado por defecto en "Def". Esto funciona para otros tipos de campos como TextField. ¿Cómo se configura el valor predeterminado para SelectField? '

Respuesta

20

La primera forma en que publicó es correcta, y me sirve. La única explicación para que no trabaja puede ser que está ejecutando una versión anterior de WTForms, que trabajó para mí en 1.0.1

+1

Estás en lo correcto. Estaba ejecutando una versión anterior. – jan

21

Creo que este problema es causado por el atributo dataField 's anulando el default con algo que WTForms no comprende (por ejemplo, un objeto de modelo de DB: espera un int). Esto sucedería si ha rellenado su formulario en el constructor de este modo:

form = PostForm(obj=post) 

la solución es configurar manualmente el atributo data después de que el formulario ha sido poblada:

form = PostForm(obj=post) 
form.category.data = (post.category.id 
         if page.category 
         else 0) # I make 0 my default 
+1

Al completar dinámicamente las opciones de la vista en el tiempo de ejecución, esta es la forma correcta de hacer que tenga una opción seleccionada por defecto. Dado que Google atrae a mucha gente a esta pregunta, probablemente esta sea la respuesta aceptada. –

+0

Bien dicho, gracias por la respuesta.Esta debería ser la respuesta seleccionada – JMS

+1

Bueno, noté que cuando cambio la opción predeterminada por otra de la lista en la vista y envío el formulario, se envía la opción predeterminada en lugar de la nueva. ¿Cómo se puede solucionar este problema? – nikitz

11

Hay algunas maneras para hacer esto. Su primer fragmento de código es realmente correcto.

Si usted quiere hacer esto en una vista de forma dinámica, sin embargo, también se puede hacer:

form = TestForm() 
form.test_field.default = some_default_id 
form.process() 
3

Este es un choices ajustes con SelectField cuando se utiliza un int, funciona así:

test_select = SelectField("Test", coerce=int, choices=[(0, "test0"), (1, "test1")], default=1) 

o:

class TestForm(Form): 
    test_select = SelectField("Test", coerce=int) 

@app.route("/test") 
def view_function(): 
    form = TestForm() 
    form.test_select.choices = [(0, "test0"), (1, "test1")] 
    form.test_select.default = 1 
    form.process() 
+1

¿Has probado la segunda variante? llamar 'form.test_select.default = 1' no cambia nada en mi sistema. – Robert

+0

¡Finalmente, algo que funciona! –

4

Flask-WTF 0.14.2 usuario aquí. Entonces esta respuesta es para cualquiera que tenga un problema similar conmigo.

Básicamente, ninguna de las soluciones anteriores funciona correctamente con form.validate_on_submit().

Configuración form.test_field.data de hecho va a cambiar el valor por defecto cuando se carga la página, pero los datos sigue siendo el mismo después devalidate_on_submit (cambios de usuario en el navegador no tiene efecto).

Configuración form.test_field.default luego llamar form.process() también cambia el valor cuando se carga la página, pero validate_on_submit fallará.

Aquí es la nueva manera de hacerlo:

class TestForm(Form): 
    test_field = SelectField("Test", choices=[(0, "test0"), (1, "test1")]) 

@app.route("/test") 
def view_function(): 
    form = TestForm(test_field=1) 
    if form.validate_on_submit(): 
    ... 
Cuestiones relacionadas