如何使用 Flask WTF 获取 SelectField 当前值

How to get SelectField current value with Flask WTF

我使用 Flask-WTF 制作了一个性别表格,这是我的代码片段:

class Gender(enum.Enum):
    Male = 'Male'
    Female = 'Female'

    def __str__(self):
        return self.value

gender = [(str(y), y) for y in (Gender)]

class EditStudentForm(Form):
    gender = SelectField('Gender', choices=gender)

@app.route('/edit_student')
def edit_student():
    student = Student.query.filter_by(id=student_id).first()
    student_form = EditStudentForm()
    # ... validate on submit
        # ....
        # ....
    return render_template(student=student, student_form=student_form)

该代码已经有效,包括我可以将数据插入数据库。

但是,如果数据库中的当前用户性别值为 Female,每当我刷新浏览器时,表单都不会获得当前值。

在HTML中我希望它是这样的:

// edit form
<form>
  <input type="" value="currentUserValueFromDatabase">
</form>

我尝试使用这种方式获取当前值:

{{ f.render_field(student_form.gender, value=student.gender) }}

但它没有根据当前用户性别预填充当前值。

所以我想要的是在 selectfield 上显示当前值或根据数据库中的当前用户值预填充 selectfield。

student 作为 obj 关键字参数传递给 EditStudentForm,例如:

student_form = EditStudentForm(obj=student_form)

为什么?来自 WTForms docs:

obj – If formdata is empty or not provided, this object is checked for attributes matching form field names, which will be used for field values.

处理GET请求时构造表单时,没有表单数据,所以会使用对象数据。

我认为您需要在将表单对象传递给模板之前设置性别字段的默认值。试试下面。

@app.route('/edit_student')
def edit_student():
    student = Student.query.filter_by(id=student_id).first()
    student_form = EditStudentForm()
    # set default
    student_form.gender.default = student.gender
    # process it to propagate the change.
    student_form.process() 
    # ... validate on submit
        # ....
        # ....
    return render_template(student_form=student_form)