【问题标题】:Fields are not populated on update更新时不填充字段
【发布时间】:2022-06-29 03:43:37
【问题描述】:

我使用 Flask 和 FlaskForm 创建了一个简单的 CRUD 应用程序。我有一个表格,其中显示了来自数据库的姓氏、名字、出生日期和性别。每个名称旁边都有标记为删除和更新的链接。当您单击更新时,您将被路由到更新页面,其中包含应填充与姓氏、名字、出生日期和性别对应的表单字段的表单。性别是一个带有男性和女性选项的选择字段,我如何从数据库中填充它?使用 FlaskForm,我尝试了 {{form.sex(value=user_to_update.sex)}},但它没有填充。

这是我的更新路线:

@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    form = Form()
    user_to_update = TblPatient.query.get_or_404(id)

    if request.method == 'POST':
        user_to_update.lastname = form.lastname.data
        user_to_update.firstname = form.firstname.data
        user_to_update.birthdate = form.birthdate.data
        user_to_update.sex = form.sex.data

        db.session.commit()

        return redirect(url_for('add_record'))
    return render_template('update.html', form=form, user_to_update=user_to_update)

这是 FlaskForm 部分:

class Form(FlaskForm):
    lastname = StringField('Last Name', validators=[DataRequired()])
    firstname = StringField('Firstname', validators=[DataRequired()])
    birthdate = DateField('Date of Birth', format='%Y-%m-%d', validators=[DataRequired()])
    sex = SelectField('Sex',
                      choices=['Select', 'Male', 'Female'],
                      default='Select',
                      validators=[DataRequired()])
    submit = SubmitField('submit')

这是我的 update.html,其中填充了除性别之外的表单字段:

<form action="{{request.path}}" method="post">
    {{form.hidden_tag()}}
    <fieldset>
        <legend>Patient Info</legend>
        <p>
            {{form.lastname.label}} <br/>
            {{form.lastname(value=user_to_update.lastname, size=30)}}
        </p>
        <p>
            {{form.firstname.label}} <br/>
            {{form.firstname(value=user_to_update.firstname, size=30)}}
        </p>
        <p>
            {{form.birthdate.label}} <br/>
            {{form.birthdate(value=user_to_update.birthdate)}}
        </p>
        <p>
            {{form.sex.label}} <br/>
            {{form.sex(value=user_to_update.sex)}}
        </p>
    </fieldset>
    <br/>
    {{form.submit}}
</form>

这是主页:

当我点击更新时,它会将我重定向到有问题的更新页面。如何根据 FlaskForm 填充性别字段?

【问题讨论】:

    标签: flask jinja2 flask-sqlalchemy flask-wtforms flask-restful


    【解决方案1】:

    如果数据库列的名称与表单输入字段的名称匹配,您只需将数据库对象传递给表单,字段就会自动填充。您不需要将数据传递到模板中的输入字段。

    patient = Patient.query.get_or_404(patient_id)
    form = PatientForm(request.form, obj=patient)
    

    使用obj 属性的替代方法是使用data 属性进行赋值。请参阅Form 类的文档。

    此外,您还可以使用populate_obj 函数将表单数据传输到数据库对象。

    form.populate_obj(patient)
    

    以下示例向您展示了端点的外观。
    从数据库中读取患者并分配给表格。如果请求是 POST 类型并且条目已成功验证,则将使用表单更新患者数据。

    @app.route('/update/<int:patient_id>', methods=['GET', 'POST'])
    def update(patient_id):
        patient = Patient.query.get_or_404(patient_id)
        form = PatientForm(request.form, obj=patient)
        if form.validate_on_submit():
            form.populate_obj(patient)
            db.session.commit()
            return redirect(url_for('add_record'))
        return render_template('update.html', **locals())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多