SelectField使用方法数据库查询使用

fields.SelectField可供使用的数据来源不只能够是预约义的,也能够是从数据库中查询。sql

tasks = [(r.task_name, r.task_name) for r in db.session.query(Task).all()]
task = fields.SelectField(label=u'发布任务',validators = [validators.required()], choices = tasks)

这样就能够很方便的从数据库中查询到全部的记录,并做为下拉列表框中的选项供使用者选择。数据库

使用SelectField存在的问题session

不过严格来讲,上述的场景并非很适合用SelectField。由于在使用过程当中会发现即便Task中的数据一直在更新而下拉列表框中的记录永远不变。函数

主要缘由是task是表单类中的一个静态成员,定义以后就保持不变。所以,即便Task表中的数据一直在变,可是tasks的结果是已经固定的。ui

 

使用QuerySelectFieldcode

解决的办法仍是有的,就是使用QuerySelectField,QuerySelectField并不在wtforms.fields文件中,因此致使咱们咱们并不知道它的存在。并且wtforms的官网也推荐咱们orm

用SelectField支持从数据库中获取记录,致使咱们误觉得能够那么使用,我忽略了QuerySelectField。sqlalchemy

 

QuerySelectField的使用ip

from wtforms.ext.sqlalchemy.fields import QuerySelectField

class MyForm(form.Form):
    def query_factory():
        return [r.name for r in db.session.query(Script).all()]
    def get_pk(obj):
    return obj
name = QuerySelectField(label=u'脚本名', validators=[validators.required()], query_factory=query_factory, get_pk=get_pk)

QuerySelectField使用起来也是蛮简单的,不过须要提供两个函数,query_factory和get_pk这两个函数。上例中的两个函数是根据我自身使用的场景来使用的,name是Script表的主键。因此,上例中可以动态获取Script表中的主键内容。下拉列表框的内容跟着Script表的数据变化在变化。恰好符合咱们的需求。get

相关文章
相关标签/搜索