我尝试使用Flask但我在提交wtforms时遇到错误sqlalchemy.exc.InterfaceError: <unprintable InterfaceError object>
。模型类是:
class Post(db.Model):
__tablename__ = 'blog_posts'
id = db.Column(db.Integer, unique=True, primary_key=True)
title = db.Column(db.String(50), unique=False)
content = db.Column(db.Text, unique=False)
user_id = db.Column(db.String, db.ForeignKey('users.username'))
@staticmethod
def post_new_entry(title, content, user_id):
""" Post new entry to database """
new_post = Post(title=title, content=content, user_id=user_id)
db.session.add(new_post)
db.session.commit()
return new_post
def __repr__(self):
return 'PostID {}: {} by {}'.format(self.id, self.title, self.user_id)
对于我的表格,我有以下内容:
class PostForm(Form):
title = StringField('Title', validators=[DataRequired(), Length(10, 65)])
post_content = TextAreaField('Content', validators=[DataRequired(), Length(50, 500)])
submit = SubmitField('Publish Post')
路线是:
@main.route('/new_post/', methods=['GET', 'POST'])
@login_required
def add_post():
form = PostForm()
if form.validate_on_submit():
Post.post_new_entry(title=form.title.data,
content=form.post_content.data,
user_id=current_user)
flash("Amazing stuff! Thanks for your submission.")
return redirect(url_for('main.index'))
return render_template('single.html', form=form)
在我的HTML上,我导入了flask-bootstrap的wtf.html
页面:
{{ wtf.quick_form(form) }}
表单显示正确,但我在表单提交时遇到上述错误。关于如何进行的任何提示或想法都会有所帮助。
答案 0 :(得分:1)
在表类定义中,您需要再添加一行来完成外键关系。
class Post(db.Model):
__tablename__ = 'blog_posts'
id = db.Column(db.Integer, unique=True, primary_key=True)
title = db.Column(db.String(50), unique=False)
content = db.Column(db.Text, unique=False)
user_id = db.Column(db.String, db.ForeignKey('users.username'))
# Setup the relationship to the User table
users = db.relationship(User)
我在一个应用程序中遇到了相同的错误消息,该应用程序有一天工作,而不是下一个工作。开车送我疯了,解决方法是我在某个地方删除了一段关系。
答案 1 :(得分:1)
在def add_post()
下你写user_id=current_user
,但那不对。
由于您为class Post
定义:
user_id = db.Column(db.String, db.ForeignKey('users.username'))
在def add_post()
中,您应该使用user_id=current_user.username
。
答案 2 :(得分:0)
将数据从应用程序写入数据库时,我收到了类似的消息。这是由于以下事实:从应用程序写入的数据必须具有与数据库中定义的格式相同的格式,例如db.Column(db.String())
数据类型不能具有列表作为输入,或任何其他{{1 }}。在这种情况下,您需要使用str()来防止此错误。
答案 3 :(得分:0)
我认为您的问题来自此领域:
Post.post_new_entry(title=form.title.data, content=form.post_content.data, user_id=current_user)
尝试做到具体,并以这种方式进行:
Post.post_new_entry(title=form.title.data, content=form.post_content.data, user_id=current_user.id)