我使用 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。
答案 0 :(得分:1)
将student
作为EditStudentForm
关键字参数传递给obj
,例如:
student_form = EditStudentForm(obj=student_form)
为什么?来自WTForms docs:
obj
–如果formdata
为空或未提供,则检查该对象是否存在 与表单字段名称匹配的属性,将用于字段 值。
在处理GET
请求时构造表单时,没有表单数据,因此它将使用对象数据。
答案 1 :(得分:1)
我认为您需要在将表单对象传递给模板之前设置性别字段的默认值。请尝试以下。
@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)