【发布时间】:2019-03-30 22:23:10
【问题描述】:
我正在创建一个视图函数来使用 wtform 编辑数据库,我想用不同表单提供的数据库中保存的信息填充表单,我的问题是提供详细信息的查询
我已阅读手册https://wtforms.readthedocs.io/en/stable/crash_course.html 以及以下问题Python Flask-WTF - use same form template for add and edit operations 但我的查询似乎没有提供正确的数据格式
数据库模型:
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()
查询的shell代码:
from homeHeating import db
from homeHeating import create_app
app = create_app()
app.app_context().push()
def editsensor(id):
edit = [(s.sensorID, s.sensorName) for s in db.session.query(Sensors).filter_by(id=id).all()]
print(edit)
editsensor(1)
[('28-0000045680fde', 'Boiler input')]
我希望这两个表单字段将填充有关由其“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'
错误表明它需要每个字段 2 个部分“framefield.populate_obj(obj, name) 我只提供了一个列数据而不是列名,“sensorID” 如果我将 # 行“edit = ...”散列,则没有错误消息并且返回表单但字段为空。所以我希望表单与数据库中的信息一起返回,填写以便我可以修改名称或传感器ID,然后更新数据库。
我希望这很清楚
热烈的问候
保罗。
ps 我已按照说明进行操作,因此 ERROR 语句只是“field.populate_by”之后的部分。
【问题讨论】:
标签: flask flask-sqlalchemy flask-wtforms