Flask &引用;form.populate“按退货填写”;错误:';列表';对象没有属性

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

我正在使用wtform创建一个视图函数来编辑数据库,我想用另一个表单提供的数据库上的信息填充表单,我的问题是提供详细信息的查询

我已经看过手册了 还有下面的问题 但我的查询似乎没有提供正确的数据格式

Database模型:

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)