When attempting to set the default value of a SelectField with WTForms, I pass in value to the \'default\' parameter like so.
class TestForm(Form):
test_fi
In case you're using flask_wtf and would like to set a default value for different SelectFields nested in a FieldList like this
from flask_wtf import FlaskForm
class FormWithSelect(FlaskForm):
my_select_field = SelectField(validators=[DataRequired()], coerce=int)
class FormWithMultipleSelects(FlaskForm):
select_fields = FieldList(FormField(FormWithSelect), min_entries=1)
submit = SubmitField(label="save all the select field values")
the solution is to overwrite data
, not default
as you would expect.
def generate_my_form(my_data, overwrite_data=True):
form = FormWithMultipleSelects(select_fields=[{
"my_select_field": {
"name": d["name"],
# ...
}
} for d in my_data]))
for n range(len(form.select_fields)):
form.select_fields[n].my_select_field.choices = [(1,'foo'), (2,'bar')]
# I wan't 'bar' to be the option selected by default
# form.select_fields[n].my_select_field.default = 2 # has no effect!
if overwrite_data:
form.select_fields[n].my_select_field.data = 2 # works
Basically this solution is similar to Elliots answer above; I just wanted to provide a solution for the more complex case of a FieldList. nikitz mentioned in a comment, that there is a side effect: form.validate_on_submit()
does not work if you're overwriting data
! You can build a simple workaround where to disable the overwriting of data
when calling validate_on_submit()
.
form_for_validation = generate_my_form(my_data, False)
if form_for_validation.validate_on_submit():
# do something with form_for_validation.data
else:
form_with_default_data = generate_my_form(my_data, True)
render_template(..., form=form_with_default_data)
It's not super elegant, but it works.
PS: My reputation is too low to directly comment on the correct answer by Elliot.