flask wtforms QuerySelectFeld form.populate_obj

我正在努力解决两个问题,


1/ QuerySelectField 未填充


2/ 如果填写了字段,则翻译错误


我有一个添加功能和一个编辑功能,我正在使用“from wtforms_alchemy.fields import QuerySelectField”来允许从一个数据库模型中进行选择,以便在下拉列表中使用。在“addboilercircuit”功能中,此功能有效,在表单中显示下拉列表,我可以提交表单。在我使用formpopulate_obj的“editboilercircuit”函数中,所有字段都已填充接受QuerySelectField,下拉列表可见但不显示保存的选择,如果我选择其中一个选项然后提交,我会收到翻译错误消息. 这是我的代码:


form.py


def boiler_ID():

    return Boilers.query


class AddBoilerCircuitForm(FlaskForm):

    name = StringField('Name', validators=[DataRequired()])

    boiler_ID = QuerySelectField('Boiler_ID',

                    query_factory=boiler_ID,

                    get_label='id')

    submit = SubmitField('Register')

models.py


class Boilers(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64))

    state = db.Column(db.String(9))


    def __repr__(self):

        return '<Boilers {}>'.format(self.id)


class Boilercircuit(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64))

    boiler_ID = db.Column(db.String(30))


    def __repr__(self):

        return '<Boilercircuit {}>'.format(self.id)

boilers.py


慕仙森
浏览 150回答 1
1回答

尚方宝剑之说

这里要考虑的关键是 ORM 支持的字段实际上处理的是 ORM 对象,而不是处理的表单字段值的标量值。这一点的证据在您传递给QuerySelectField构造函数的可调用查询中:def boiler_ID():&nbsp; &nbsp; return Boilers.query这是一个返回Boilers实例而不是整数 ID 值的查询。要对其进行排序,relationship请在您的模型上添加一个字段,boiler并将您的表单字段与该字段相关联。我们还需要添加一个外键,boilercircuit.boiler_ID以便关系可以建立到boilers表的连接路径。# adds a `ForeignKey` constraint to `boiler_ID` and a `boiler`&nbsp;# relationship to your `BoilerCircuit` object.class Boilercircuit(db.Model):&nbsp; &nbsp; id = db.Column(db.Integer, primary_key=True)&nbsp; &nbsp; name = db.Column(db.String(64))&nbsp; &nbsp; boiler_ID = db.Column(db.String(30), db.ForeignKey("boilers.id"))&nbsp; &nbsp; boiler = db.relationship("Boilers")&nbsp; &nbsp; def __repr__(self):&nbsp; &nbsp; &nbsp; &nbsp; return '<Boilercircuit {}>'.format(self.id)然后修改表格:# renames the `boiler_ID` field to `boiler` and also the field's label.class AddBoilerCircuitForm(FlaskForm):&nbsp; &nbsp; name = StringField('Name', validators=[DataRequired()])&nbsp; &nbsp; boiler = QuerySelectField('boiler',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; query_factory=boiler_ID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get_label='id')&nbsp; &nbsp; submit = SubmitField('Register')您还需要更改您在AddBoilerCircuitForm.boiler_ID整个视图和模板中所做的任何引用,因为该字段不再存在于表单中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python