Flask WTF 表单未与 sqlite3 数据库同步

2 投票
1 回答
1183 浏览
提问于 2025-04-17 14:21

我有一个叫做RadioField的表单项,它的选项是从数据库里获取的。

如果数据库没有创建,我就无法启动Flask Web服务器,尽管它应该只在我访问那个页面并加载表单时才会访问数据库。

如果我在Web服务器运行的时候更新了数据库,我不会看到表单里显示新的数据库信息。

直到我重启Flask Web服务器。

我该怎么做才能让表单在你访问页面时强制重新加载数据库里的值呢?

另外,我很确定RadioField的值是存储在内存里的,因为我可以删除数据库,而Flask Web服务器仍然可以继续运行,RadioField依然会显示。

我使用的是sqlite3数据库,并通过APSW(另一个Python的sqlite3封装)来读写数据。

这是我的表单

class DatabaseForm(Form):
    listOfRows = db.getDatabase()
    rows = [(str(x[0]), x) for x in listOfRows]
    images = RadioField('images', validators = [Required()], choices = rows)

这是我的视图

@app.route('/database', methods = ['GET', 'POST'])
def database():
    ''' displays the database and allows the user to select an entry '''
    form = DatabaseForm()
    if form.validate_on_submit():

        primaryKey = form.images.data
        primaryKey = int(primaryKey)


        myProgram.start(primaryKey)
        return render_template('simple.html', word = "SUCCESS")
    else:
        print form.errors

    return render_template('database.html', form=form)

1 个回答

5

你应该在视图中设置字段选项:

    form = DatabaseForm()
    form.images.choices = [(str(x[0]), x) for x in listOfRows]
    if form.validate_on_submit():

如果你只在类里设置一次这些选项,那么这些选项只会在创建这个类的时候被设置。这样的话,在这个过程运行期间,如果你对选项做了什么修改,它们是不会反映出来的。

撰写回答