Flask - 当数据库文件被分离时,如何以 wtf 形式填充选择字段?

Mas*_*gol 4 flask

我已经分离了模型文件并使用了应用程序工厂。项目结构是这样的:

project/
|-- config.py
|-- core.py      # app factory definition which calls db.init_app(app)
|-- database.py  # models definition and 'db = SQLAlchemy()' is done here
|-- forms.py     # forms definition.
|-- __init__.py  # app = create_app() is done here
\-- routes.py
Run Code Online (Sandbox Code Playgroud)

我有两个模型:文章和类别。然后,在forms.py,我尝试这样做:

class ArticleForm(Form):
    title = StringField()
    content = TextAreaField()
    category = SelectField(
        choices=[(c.id, c.name) for c in Category.query.all()]
    )
Run Code Online (Sandbox Code Playgroud)

所以,Category.query.all()被称为外部应用程序上下文并提出这个:

RuntimeError: application not registered on db instance and no application
bound to current context
Run Code Online (Sandbox Code Playgroud)

那么,如何SelectField使用数据库中的现有数据填充?

Dau*_*ros 10

您可以使用 WTForms 的QuerySelectField扩展:

from flask_wtf import Form
from wtforms.fields import StringField, TextAreaField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from database import Category

class ArticleForm(Form):
    title = StringField()
    content = TextAreaField()
    category = QuerySelectField(query_factory=lambda: Category.query.all())
Run Code Online (Sandbox Code Playgroud)


Sob*_*gen 5

这篇博文对我有所帮助,因为我无法像我想要的那样得到公认的答案。也摆脱了导入。

http://kyle.marek-spartz.org/posts/2014-04-04-setting-wtforms-selection-fields-dynamically.html

我使用了他的第二种技术,这个问题看起来像

from flask_wtf import Form
from wtforms.fields import StringField, TextAreaField
from database import Category

class ArticleForm(Form):
    title = StringField()
    content = TextAreaField()
    category = SelectField()

    def __init__(self):
        super(ArticleForm, self).__init__()
        self.category.choices = [(c.id, c.name) for c in Category.query.all()]
Run Code Online (Sandbox Code Playgroud)

  • 这种语法对我不起作用,所以我不得不将其调整为: def __init__(self, *args, **kwargs): super(ArticleForm, self).__init__(*args, **kwargs) (2认同)