如何在使用flask-sqlalchemy时为wtforms-alchemy设置会话?

0 投票
1 回答
1532 浏览
提问于 2025-04-17 21:57

我在我的应用程序中使用flask-sqlalchemy,并通过init_app()来初始化SQLAlchemy,像这样:

in config file :

SQLALCHEMY_DATABASE_URI = 'sqlite:///example.db'
---------------------    
in extension file :

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()
---------------------
in application file: 

#in my application file that generate my app
from ----- import db 

db.init_app(app)

我的模型是:

from -------- import db

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, autoincrement=True , primary_key=True)
    username = db.Column(db.String(50),unique=True)
    password = db.Column(db.String(50))
    email = db.Column(db.String(50),unique=True)

    def __repr__(self):
        return '<User %r>' % self.username

现在当我在form.py中使用wtforms-alchemy,像这样:

from wtforms_alchemy import ModelForm

class UserForm(ModelForm):
    class Meta:
        model = User

我遇到了这个错误:

File "/usr/local/lib/python2.7/dist-packages/wtforms_components/validators.py", line 220, in _check_for_session
raise Exception('Could not obtain SQLAlchemy session.')

Exception: Could not obtain SQLAlchemy session.

我该如何修复这个问题呢?

1 个回答

1

来自WTForms-Alchemy的高级部分

为了让WTForms-Alchemy能够和Flask-WTF一起使用,你需要以下这段代码:

from flask.ext.wtf import Form
from wtforms_alchemy import model_form_factory

ModelForm = model_form_factory(Form)

然后你就可以像以前一样使用ModelForm了:

class UserForm(ModelForm):
    class Meta:
        model = User

确实依赖于User有一个.query对象;也就是说,你的User模型必须是从db.Model派生的。如果不是的话,你需要在表单上定义一个get_session方法:

class UserForm(ModelForm):
    class Meta:
        model = User

    def get_session(self):
        return db.session

撰写回答