我正在使用Flask开发一款小型阅读跟踪应用程序。我似乎无法从下面的一条路由中写入数据:
@app.route('/add_book', methods=['GET', 'POST'])
@login_required
def add_book():
form=BookForm()
if request.method=='POST':
if form.validate_on_submit():
book=Book(
title=form.title.data,
author=form.author.data,
# category=form.category.data,
# added_on=form.added_on.data,
# done=form.done.data,
user_id=current_user
)
db.session.add(book)
db.session.commit()
flash('Book added')
return redirect(url_for('books'))
else:
flash('ERROR. The book not added.')
return render_template('add_book.html', form=form)
这是相应的HTML:
{% extends "layout.html" %}
{% block content %}
{% if form %}
<form action="{{ url_for('add_book') }}" method="post">
{{ form.hidden_tag() }}
{{ form.title.label }}<br>
{{ form.title() }}<br>
{{ form.author.label }}<br>
{{ form.author(cols=32, rows=4) }}<br>
<!-- {{ form.category.label }}<br>
{{ form.category() }}<br> -->
{{ form.submit() }}
</form>
{% endif %}
{% endblock %}
页面呈现后,将显示书籍和作者的标签和表格,但是单击“提交”时,数据不会保存。
代码部分类似于注册用户的部分,由于无法看到任何错误,因此我被困在做什么方面。我正在使用SQLite作为数据库。
这是本书的模型:
class Book(db.Model):
__tablename__='books'
id=db.Column(db.Integer, primary_key=True)
title=db.Column(db.String(100))
author=db.Column(db.String(50))
# category=db.Column(db.String(50))
added_on=db.Column(db.DateTime, index=True, default=datetime.utcnow)
done=db.Column(db.Boolean, default=False)
user_id=db.Column(db.Integer, db.ForeignKey('users.id'))
def __init__(self, title, author, added_on, done, user_id):
self.title=title
self.author=author
self.added_on=added_on
self.done=done
self.user_id=user_id
def __repr__(self):
# return '<Book: Title - {0}, Author - {1}, Category - {2}>'.format(self.title, self.author, self.category)
return '<Book: Title - {0}, Author - {1}>'.format(self.title, self.author)
答案 0 :(得分:0)
current_user是一个用户代理,可以访问所有用户属性或使用类似How to track the current user in flask-login?
一种快速的解决方案是更改此行
user_id = current_user
进入此
user_id = current_user.id
更新: 好,我知道了。您需要以下修复程序,每个修复程序都会导致表单验证和/或提交数据库方面的麻烦: -如前所述,在您的book对象中使用current_user.id。 -删除了书籍模型中的init方法。我不确定当前增加的值是什么,我收到有关表单上未添加和完成的字段的错误消息。我没有花时间进一步研究它。 -只需if request.method =='POST'即可,因为您不需要两者。无论如何,都会检查该表单以进行验证。
提示:不要忘记创建需求文件(pip Frozen-> requirements.txt),这使得在新的虚拟环境中重新安装变得容易得多。