【问题标题】:Get choices from a DataBase query in wtforms and flask-sqlalchemy从 wtforms 和 flask-sqlalchemy 中的数据库查询中获取选择
【发布时间】:2016-02-10 11:35:27
【问题描述】:

我正在使用 Flask、SQLAlchemy 和 WTForms 开发一个 Web 应用程序。我想通过我的数据库从查询中获得 SelectField 中的选择。

更多细节。

my_query = my_table.query.with_entities(My_Entities).all()

结果

[(u'1',), (u'2',), (u'3',)]

我的班级

class MyForm(Form):
    My_Var = SelectField(choices=RIGHT_HERE)

有什么办法吗?

【问题讨论】:

    标签: flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    在这种情况下,您可以使用 WTForms 中的扩展。你要做的是导入你需要的QuerySelectField

    from wtforms.ext.sqlalchemy.fields import QuerySelectField

    然后你创建一个函数来查询数据库并返回你需要的东西:

    def skill_level_choices():      
        return db.session.query(SkillLevel).all()
    

    获得查询对象后,您可以使用query_factory 参数将其放入QuerySelectField

    skill_level = QuerySelectField(u'Skill level',      
                                   validators=[Required()],
                                   query_factory=skill_level_choices)
    

    【讨论】:

    • 这是forms.py下的吗?
    • @m1yag1 :所以代码需要包含在class MyForm(Form)中?谢谢。
    • 只查询对象并将它们作为选项放在选择字段中是没有意义的。哪个字段是标签?值是多少?
    • 这是使用 QuerySelectField 所以它为你做。如果您要使用股票 SelectField,那么您需要将标签和值的元组对传递给选择。这就是为什么它被称为 query_factory。
    【解决方案2】:

    解决方案:

    wtformspeewee 有非常相似的问题,这是我的解决方法

    class MyForm(FlaskForm):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    
            self.my_select_field.choices = [
                (el.id, el.description) for el in MyModel.select()
            ]
    
        my_select_field = SelectField("Field", coerce=int)
    

    说明:

    我们修改了原来的FlaskForm,使其在每次创建时都会执行数据库查询。

    所以MyForm 数据选择保持最新。

    【讨论】:

      【解决方案3】:

      使用数据库中的值填充 QuerySelectField

      from wtforms.ext.sqlalchemy.fields import QuerySelectField
      
      from flask_sqlalchemy import SQLAlchemy
      name=QuerySelectField('Name',query_factory=lambda:my_table.query,get_label="username")
      

      【讨论】:

      • 嗨@jobinv12!我认为可以通过添加对代码的作用和作用的简短描述来改进这个答案。
      猜你喜欢
      • 2020-06-10
      • 2020-02-21
      • 2012-08-23
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2019-10-12
      • 1970-01-01
      相关资源
      最近更新 更多