如何使用 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)
我使用 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
– Ifformdata
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)