【问题标题】:SelectField WTforms not valid choice and sa_instance_stateSelectField WTforms 无效的选择和 sa_instance_state
【发布时间】:2016-09-10 05:38:59
【问题描述】:

在使用 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()])

所以现在,使用代码......我遇到了“不是一个有效的选择”问题。我假设它将我的评分解释为字符串或元组或其他东西,因此它不能正确地提供给rating=db.column(db.Integer)

但是,在将 coerce=int 添加到选择字段参数后,我开始遇到:

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__

我显然在这里遗漏了一些东西或发送了错误的东西......我只是不够精明,无法深入了解表单返回的内容并弄清楚。

【问题讨论】:

  • 请注意,我已经尝试过 coerce=int 并得到上面的属性错误。有什么帮助吗?

标签: python flask sqlalchemy wtforms


【解决方案1】:

首先,您可以随时打印 from.data 来查看哪些数据被发回进行评级。

现在关于你的第二个错误_sa_instance_state。看起来它是由您的 g.user 引起的。如果该用户已经存在于数据库中,sqlalchemy 将只设置外键。如果它是一个新的/匿名用户对象,它会尝试将用户与您的评论一起保存。

您的用户是 AnonymousUserMixin 类型的用户吗?如果是,您是否在用户继承中缺少 db.Model

【讨论】:

  • 抱歉这么晚才回复!你是对的。我收到错误的原因是因为我不是实例中的登录用户,并且我没有为此建立异常规则!愚蠢的我知道,但是如果他们忘记了哈哈,发布这个来帮助别人。
猜你喜欢
  • 2018-04-05
  • 2020-02-27
  • 2021-12-20
  • 2019-10-12
  • 2023-03-27
  • 1970-01-01
  • 2016-07-10
  • 2021-05-15
  • 2012-12-20
相关资源
最近更新 更多