SelectField WTforms 不是有效的选择和 sa_instance_state
SelectField WTforms not valid choice and sa_instance_state
我在使用 Flask/SQLalchemy 构建的应用程序中实现 WTForms SelectField 时遇到了一些错误。
相关代码如下:
Views.py:
form = ReviewForm()
if form.validate_on_submit():
review = Review(rating=form.rating.data, body=form.body.data, pub_date=datetime.utcnow(), author=g.user, item=thing)
db.session.add(review)
db.session.commit()
Models.py
RATING_CHOICES = (
(1, '1'),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
)
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
pub_date = db.Column(db.DateTime)
body = db.Column(db.Text)
rating = db.Column(db.Integer)
Forms.py
class ReviewForm(Form):
rating = SelectField('rating', choices=Review.RATING_CHOICES, validators=[Required()])
body = TextAreaField('body', validators=[Required()])
tags = StringField('tags', validators=[Required()])
所以现在,使用原样的代码...我遇到了 "Not a valid choice" 问题。我假设它将我的评级解释为字符串或元组或其他东西,结果,它没有正确地提供给 rating=db.column(db.Integer)
。
但是,在将 coerce=int 添加到 selectfield 参数后,我开始遇到:
AttributeError: 'AnonymousUserMixin' object has no attribute '_sa_instance_state'
File "", line 194, in blank
review = Review(rating=form.rating.data, body=form.body.data, pub_date=datetime.utcnow(), author=g.user, item=thing)
File "<string>", line 4, in __init__
我显然在这里遗漏了一些东西或发送了一些错误的东西...我只是不够聪明,无法深入研究表单返回的内容并找出答案。
首先,您可以随时打印 from.data 以查看正在发送回哪些数据用于评级。
现在关于你的第二个错误 _sa_instance_state。看起来它是由您的 g.user 引起的。如果这个用户已经存在于数据库中,sqlalchemy 将只设置外键。如果它是 new/anonymous 用户对象,它会尝试将用户与您的评论一起保存。
您的用户类型是 AnonymousUserMixin 吗?如果是,您是否在用户继承中缺少 db.Model?
我在使用 Flask/SQLalchemy 构建的应用程序中实现 WTForms SelectField 时遇到了一些错误。
相关代码如下:
Views.py:
form = ReviewForm()
if form.validate_on_submit():
review = Review(rating=form.rating.data, body=form.body.data, pub_date=datetime.utcnow(), author=g.user, item=thing)
db.session.add(review)
db.session.commit()
Models.py
RATING_CHOICES = (
(1, '1'),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
)
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
pub_date = db.Column(db.DateTime)
body = db.Column(db.Text)
rating = db.Column(db.Integer)
Forms.py
class ReviewForm(Form):
rating = SelectField('rating', choices=Review.RATING_CHOICES, validators=[Required()])
body = TextAreaField('body', validators=[Required()])
tags = StringField('tags', validators=[Required()])
所以现在,使用原样的代码...我遇到了 "Not a valid choice" 问题。我假设它将我的评级解释为字符串或元组或其他东西,结果,它没有正确地提供给 rating=db.column(db.Integer)
。
但是,在将 coerce=int 添加到 selectfield 参数后,我开始遇到:
AttributeError: 'AnonymousUserMixin' object has no attribute '_sa_instance_state'
File "", line 194, in blank
review = Review(rating=form.rating.data, body=form.body.data, pub_date=datetime.utcnow(), author=g.user, item=thing)
File "<string>", line 4, in __init__
我显然在这里遗漏了一些东西或发送了一些错误的东西...我只是不够聪明,无法深入研究表单返回的内容并找出答案。
首先,您可以随时打印 from.data 以查看正在发送回哪些数据用于评级。
现在关于你的第二个错误 _sa_instance_state。看起来它是由您的 g.user 引起的。如果这个用户已经存在于数据库中,sqlalchemy 将只设置外键。如果它是 new/anonymous 用户对象,它会尝试将用户与您的评论一起保存。
您的用户类型是 AnonymousUserMixin 吗?如果是,您是否在用户继承中缺少 db.Model?