我查看了其他一些类似的问题,似乎并非如此,但我不太确定。
这是我的路线:
@app.route('/status/<int:id>', methods=['GET', 'POST'])
@login_required
def status(id):
form = CommentForm()
book = Books.query.filter_by(id=id).first()
if form.validate_on_submit:
comment = Comments(comment_text=form.comment_text.data, book=book.id)
db.session.add(comment)
db.session.commit()
return redirect(url_for("dashboard"))
bookview = Books.query.filter_by(id=id).first()
return render_template('post.html', bookview=bookview, form=form)
这是我的桌子:
class Books(db.Model):
id = db.Column(db.Integer, primary_key=True)
author = db.Column(db.String)
title = db.Column(db.String)
description = db.Column(db.String)
comments = db.relationship('Comments', backref='book')
class Comments(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
comment_text = db.Column(db.String)
parent = db.Column(db.Integer, db.ForeignKey('books.id'))
这是我的html
<form method="POST">
{{ form.hidden_tag() }}
{{ wtf.form_field(form.comment_text) }}
<button type="submit">Comment</button>
</form>
我似乎不明白出了什么问题,我觉得它应该可以工作。
这是整个错误:
创建新评论时,无需引用
book=book.id
,只需引用实际对象即可:
comment = Comments(comment_text=form.comment_text.data, book=book)
当您创建
book
backref SQLAlchemy 期望它是一个 SQLAlchemy 对象实例。由于您将 int
分配给 book
,ORM 会尝试像 SQLAlchemy 对象一样进行处理,因此会出现 'int' object has no attribute _sa_instance_state
(即 SQLAlchemy 尝试访问此属性)。
如果您想分配
int
值而不是对象,请将其分配给 parent
列:
comment = Comments(comment_text=form.comment_text.data, parent=book.id)
另外,我建议您从
UserMixin
模型中删除 Flask-Login Comments
。这可能是一个ctrl+c/ctrl+v
错误。