为了账号安全,请及时绑定邮箱和手机立即绑定

flask wtforms QuerySelectFeld form.populate_obj

flask wtforms QuerySelectFeld form.populate_obj

慕仙森 2022-06-22 18:09:08
我正在努力解决两个问题,1/ QuerySelectField 未填充2/ 如果填写了字段,则翻译错误我有一个添加功能和一个编辑功能,我正在使用“from wtforms_alchemy.fields import QuerySelectField”来允许从一个数据库模型中进行选择,以便在下拉列表中使用。在“addboilercircuit”功能中,此功能有效,在表单中显示下拉列表,我可以提交表单。在我使用formpopulate_obj的“editboilercircuit”函数中,所有字段都已填充接受QuerySelectField,下拉列表可见但不显示保存的选择,如果我选择其中一个选项然后提交,我会收到翻译错误消息. 这是我的代码:form.pydef boiler_ID():    return Boilers.queryclass AddBoilerCircuitForm(FlaskForm):    name = StringField('Name', validators=[DataRequired()])    boiler_ID = QuerySelectField('Boiler_ID',                    query_factory=boiler_ID,                    get_label='id')    submit = SubmitField('Register')models.pyclass 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
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这里要考虑的关键是 ORM 支持的字段实际上处理的是 ORM 对象,而不是处理的表单字段值的标量值。这一点的证据在您传递给QuerySelectField构造函数的可调用查询中:


def boiler_ID():

    return Boilers.query

这是一个返回Boilers实例而不是整数 ID 值的查询。


要对其进行排序,relationship请在您的模型上添加一个字段,boiler并将您的表单字段与该字段相关联。我们还需要添加一个外键,boilercircuit.boiler_ID以便关系可以建立到boilers表的连接路径。


# adds a `ForeignKey` constraint to `boiler_ID` and a `boiler` 

# relationship to your `BoilerCircuit` object.


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), db.ForeignKey("boilers.id"))


    boiler = db.relationship("Boilers")


    def __repr__(self):

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

然后修改表格:


# renames the `boiler_ID` field to `boiler` and also the field's label.

class AddBoilerCircuitForm(FlaskForm):

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

    boiler = QuerySelectField('boiler',

                    query_factory=boiler_ID,

                    get_label='id')

    submit = SubmitField('Register')

您还需要更改您在AddBoilerCircuitForm.boiler_ID整个视图和模板中所做的任何引用,因为该字段不再存在于表单中。


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信