Flask &引用;form.populate“按退货填写”;错误:';列表';对象没有属性
我正在使用wtform创建一个视图函数来编辑数据库,我想用另一个表单提供的数据库上的信息填充表单,我的问题是提供详细信息的查询 我已经看过手册了 还有下面的问题 但我的查询似乎没有提供正确的数据格式 Database模型:Flask &引用;form.populate“按退货填写”;错误:';列表';对象没有属性,flask,flask-sqlalchemy,flask-wtforms,Flask,Flask Sqlalchemy,Flask Wtforms,我正在使用wtform创建一个视图函数来编辑数据库,我想用另一个表单提供的数据库上的信息填充表单,我的问题是提供详细信息的查询 我已经看过手册了 还有下面的问题 但我的查询似乎没有提供正确的数据格式 Database模型: class Sensors(db.Model): id = db.Column(db.Integer, primary_key=True) sensorID = db.Column(db.String, unique=True) name = db.C
class Sensors(db.Model):
id = db.Column(db.Integer, primary_key=True)
sensorID = db.Column(db.String, unique=True)
name = db.Column(db.String(30), unique=True)
表格模型:
class AddSensorForm(FlaskForm):
sensorID = StringField('sensorID', validators=[DataRequired()])
sensorName = StringField('sensorName', validators=[DataRequired()])
submit = SubmitField('Register')
查看功能:
@bp.route('/sensors/editsensor/<int:id>', methods=('GET', 'POST'))
@login_required
def editsensor(id):
edit = [(s.sensorID, s.sensorName) for s in db.session.\
query(Sensors).filter_by(id=id).all()]
form = AddSensorForm(obj=edit)
form.populate_obj(edit)
if form.validate_on_submit():
sensors = Sensors(sensorID=form.sensorID.data, sensorName=form.sensorNa$
db.session.add(sensors)
db.session.commit()
我希望这两个表单字段将填充有关由其“id”调用的传感器的信息
但是我得到了这个错误
File "/home/pi/heating/homeHeating/sensors/sensors.py", line 60, in
editsensor
form.populate_obj(edit)
File "/home/pi/heating/venv/lib/python3.7/site-
packages/wtforms/form.py", line 96, in populate_obj
Open an interactive python shell in this
framefield.populate_obj(obj, name)
File "/home/pi/heating/venv/lib/python3.7/site-
packages/wtforms/fields/core.py", line 330, in populate_obj
setattr(obj, name, self.data)
AttributeError: 'list' object has no attribute 'sensorID'
错误表明它需要为每个字段“framefield.populate_obj(obj,name)mine”提供两个部分。mine只提供一个列数据,而不提供列名称“sensorID”
如果我散列出“edit=…”行,则没有错误消息,返回表单,但字段为空。因此,我希望表单返回时包含数据库中的信息,并进行填充,以便修改名称或传感器ID,然后更新数据库
我希望这是清楚的
问候
保罗
ps我已按照说明进行操作,因此错误语句仅为“field.populate_by”之后的部分。您正在尝试将一项列表传递到表单 通常,基于模型的主键选择单个记录时,请使用Query.get()而不是Query.filter(…).all()[0] 此外,您需要将请求数据传递到表单,以便在提交时对其进行验证,并在表单报告错误时预填充字段 只有当您的请求方法为POST且表单通过验证时,提交时的Form.validate才返回True;这是表单告诉您“用户提供的语法正确的信息,现在您可以进行更多检查,我可以使用提供给我的数据填充现有对象”的步骤 您还需要处理表单第一次显示给用户的情况
@bp.route('/sensors/editsensor/<int:id>', methods=('GET', 'POST'))
@login_required
def editsensor(id):
obj = Sensors.query.get(id) or Sensors()
form = AddSensorForm(request.form, obj=obj)
if form.validate_on_submit():
form.populate_obj(obj)
db.session.add(obj)
db.session.commit()
# return response or redirect here
return redirect(...)
else:
# either the form has errors, or the user is displaying it for
# the first time (GET)
return render_template('sensors.html', form=form, obj=obj)
@bp.route('/sensors/editsensor/',methods=('GET','POST'))
@需要登录
def传感器(id):
obj=Sensors.query.get(id)或Sensors()
form=AddSensorForm(request.form,obj=obj)
if form.validate_on_submit():
表格。填充_obj(obj)
db.session.add(obj)
db.session.commit()
#在此处返回响应或重定向
返回重定向(…)
其他:
#表单有错误,或者用户正在为其显示
#第一次(得到)
返回渲染模板('sensors.html',form=form,obj=obj)
您可以通过创建新的传感器实例来处理get(id)
不返回任何内容的情况,将此“编辑传感器视图”轻松更改为通用的“创建或编辑传感器视图”。obj=Sensors.query.get(id)或Sensors()
很有效!非常感谢,非常感谢您查看我的问题。并帮助我!!!!!非常欢迎您!如果这个答案有用,请投票并/或接受它作为答案。哦,忘了添加,Flask SQLAlchemy提供get_或_404(id)方法,该方法在找不到对象时引发404异常,中止请求并显示404页。
@bp.route('/sensors/editsensor/<int:id>', methods=('GET', 'POST'))
@login_required
def editsensor(id):
obj = Sensors.query.get(id) or Sensors()
form = AddSensorForm(request.form, obj=obj)
if form.validate_on_submit():
form.populate_obj(obj)
db.session.add(obj)
db.session.commit()
# return response or redirect here
return redirect(...)
else:
# either the form has errors, or the user is displaying it for
# the first time (GET)
return render_template('sensors.html', form=form, obj=obj)