无法在Flask中将数据写入db

时间:2019-02-19 15:36:19

标签: sqlite flask

我正在使用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)

1 个答案:

答案 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),这使得在新的虚拟环境中重新安装变得容易得多。