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

时间:2019-09-07 03:32:49

标签: flask flask-wtforms wtforms

我使用 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)

该代码已经可以工作了,包括我可以将数据插入数据库中了。

enter image description here

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

在HTML中,我希望它像这样:

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

我尝试通过这种方式获取当前值:

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

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

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

2 个答案:

答案 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)