我正在 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)
current_user 是一个用户代理,可以访问所有用户属性或使用类似的内容如何在flask-login 中跟踪当前用户?
一个快速的解决方案是改变这条线
user_id = current_user
进入这个
user_id = current_user.id
更新:好的,我让它工作了。您需要以下修复,它们中的每一个都会导致表单验证和/或提交到数据库的问题: - 正如我之前所说,在您的书对象中使用 current_user.id。- 删除了书籍模型中的 init 方法。我现在不确定增加的价值是什么,我收到有关添加和完成的字段的错误消息,这些字段不在表单上。我没有花时间进一步研究它。- 就去 if request.method=='POST' 因为你不需要两者。无论如何都会检查表单以进行验证。
提示:不要忘记创建一个需求文件(pip freeze --> requirements.txt),这使得在新的虚拟环境中重新安装变得更加容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句