How do you set a default value for a WTForms SelectField?

后端 未结 7 613
-上瘾入骨i
-上瘾入骨i 2020-11-29 04:09

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         


        
相关标签:
7条回答
  • 2020-11-29 05:07

    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.

    0 讨论(0)
提交回复
热议问题