flask wtforms QuerySelectFeld form.populate_obj 字段未填充,如果填写错误,则会引发翻译
flask wtforms QuerySelectFeld form.populate_obj fields not populated and if filled in error translate raised
我正在努力解决两个问题,
1/ QuerySelectField 未填充
2/ 填写字段翻译错误
我有一个添加功能和一个编辑功能,我正在使用
"from wtforms_alchemy.fields import QuerySelectField" 允许在下拉列表中从一个数据库模型中进行选择。在这个有效的 "addboilercircuit" 函数中,在表单中显示了一个下拉列表,我可以提交表单。在我使用的 "editboilercircuit" 函数中 formpopulate_obj 所有字段都被填充接受 QuerySelectField,下拉列表是可见但它不显示已保存的选择,如果我 select 其中一个选择然后提交,我会收到 translate 错误消息。
这是我的代码:
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
@bp.route('/boilers/editboilercircuit/<int:id>', methods=('GET', 'POST'))
@login_required
def editboilercircuit(id):
obj = Boilercircuit.query.get(id) or Boilers()
form = AddBoilerCircuitForm(request.form, obj=obj)
if form.validate_on_submit():
form.populate_obj(obj)
db.session.add(obj)
db.session.commit()
flash('Congratulations, you are have updated a Boiler Circuit!')
return redirect(url_for('boilers.boilercircuits'))
return render_template('boilers/editboilercircuit.html', title= 'edit boilercircuit',
form=form, obj=obj)
和html
editboilercircuit.html
<h2>Edit Boiler Circuit</h2>
<form action="" method="post">
{{ form.hidden_tag() }}
<div>{{ form.name.label }} {{ form.name(class="input") }}</div>
<div>{{ form.boiler_ID.label }} {{ form.boiler_ID(class="input") }}</div>
<div>{{ form.submit(class="submit") }}</div>
<form>
错误信息是
AttributeError: 'Boilers' object has no attribute 'translate'
在 "addboilercircuit" 函数上工作正常,在我的视图函数中接受我必须向每个 QuerySelectField 添加 str 以避免 "translate error" 这是我的代码
def addboilercircuit():
form = AddBoilerCircuitForm()
if form.validate_on_submit():
boilercircuit = Boilercircuit(name=form.name.data,
boiler_ID=str(form.boiler_ID.data), #here I have added "str"
我在所有论坛中搜索了一个类似的问题,但大多数与添加功能有关,这帮助我清理了我的代码(感谢@sean)和许多其他问题。我希望我的问题很清楚
提前致谢
保罗
这里要注意的关键是 ORM 支持的字段实际上处理 ORM 对象,而不是处理的表单字段值的标量值。您传递给 QuerySelectField
构造函数的可调用查询就是证据:
def boiler_ID():
return Boilers.query
这是 returns Boilers
个实例的查询,而不是整数 ID 值。
要对其进行排序,请在名为 boiler
的模型中添加一个 relationship
字段,并将您的表单字段关联到该字段。我们还需要在 boilercircuit.boiler_ID
上添加外键,以便关系可以建立到 boilers
table.
的连接路径
# 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
所做的任何引用,因为该字段不再存在于表单中。
我正在努力解决两个问题,
1/ QuerySelectField 未填充
2/ 填写字段翻译错误
我有一个添加功能和一个编辑功能,我正在使用 "from wtforms_alchemy.fields import QuerySelectField" 允许在下拉列表中从一个数据库模型中进行选择。在这个有效的 "addboilercircuit" 函数中,在表单中显示了一个下拉列表,我可以提交表单。在我使用的 "editboilercircuit" 函数中 formpopulate_obj 所有字段都被填充接受 QuerySelectField,下拉列表是可见但它不显示已保存的选择,如果我 select 其中一个选择然后提交,我会收到 translate 错误消息。 这是我的代码:
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
@bp.route('/boilers/editboilercircuit/<int:id>', methods=('GET', 'POST'))
@login_required
def editboilercircuit(id):
obj = Boilercircuit.query.get(id) or Boilers()
form = AddBoilerCircuitForm(request.form, obj=obj)
if form.validate_on_submit():
form.populate_obj(obj)
db.session.add(obj)
db.session.commit()
flash('Congratulations, you are have updated a Boiler Circuit!')
return redirect(url_for('boilers.boilercircuits'))
return render_template('boilers/editboilercircuit.html', title= 'edit boilercircuit',
form=form, obj=obj)
和html editboilercircuit.html
<h2>Edit Boiler Circuit</h2>
<form action="" method="post">
{{ form.hidden_tag() }}
<div>{{ form.name.label }} {{ form.name(class="input") }}</div>
<div>{{ form.boiler_ID.label }} {{ form.boiler_ID(class="input") }}</div>
<div>{{ form.submit(class="submit") }}</div>
<form>
错误信息是
AttributeError: 'Boilers' object has no attribute 'translate'
在 "addboilercircuit" 函数上工作正常,在我的视图函数中接受我必须向每个 QuerySelectField 添加 str 以避免 "translate error" 这是我的代码
def addboilercircuit():
form = AddBoilerCircuitForm()
if form.validate_on_submit():
boilercircuit = Boilercircuit(name=form.name.data,
boiler_ID=str(form.boiler_ID.data), #here I have added "str"
我在所有论坛中搜索了一个类似的问题,但大多数与添加功能有关,这帮助我清理了我的代码(感谢@sean)和许多其他问题。我希望我的问题很清楚 提前致谢
保罗
这里要注意的关键是 ORM 支持的字段实际上处理 ORM 对象,而不是处理的表单字段值的标量值。您传递给 QuerySelectField
构造函数的可调用查询就是证据:
def boiler_ID():
return Boilers.query
这是 returns Boilers
个实例的查询,而不是整数 ID 值。
要对其进行排序,请在名为 boiler
的模型中添加一个 relationship
字段,并将您的表单字段关联到该字段。我们还需要在 boilercircuit.boiler_ID
上添加外键,以便关系可以建立到 boilers
table.
# 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
所做的任何引用,因为该字段不再存在于表单中。