【问题标题】:Dynamic select field using WTForms not updating使用 WTForms 的动态选择字段未更新
【发布时间】:2015-10-15 16:05:18
【问题描述】:

我正在尝试使用 wtforms 和 sqlalchemy 创建一个动态选择字段,但在从数据库中插入或删除项目时它不会更新。这是我的代码:

class UserForm(Form):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    job = SelectField(
        'Job',
        validators=[DataRequired()],
        choices=[(a.id, a.name) for a in Job.query.order_by(Job.name)]
    )

以及数据库模型:

class Job(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String)

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Job %s>' % self.name

它成功地在选择字段中显示作业,但是如果您修改表,它不会更新,除非您完全重新启动应用程序。

【问题讨论】:

    标签: python flask sqlalchemy wtforms flask-wtforms


    【解决方案1】:

    您应该在创建表单对象时初始化表单选项:

    class UserForm(Form):
        username = StringField('Username', validators=[DataRequired()])
        password = PasswordField('Password', validators=[DataRequired()])
        job = SelectField(
            'Job',
            validators=[DataRequired()]
        )
    
        def __init__(self, *args, **kwargs):
            super(UserForm, self).__init__(*args, **kwargs)
            self.job.choices = [(a.id, a.name) for a in Job.query.order_by(Job.name)]
    

    或者在视图中:

    form = UserForm()
    form.job.choices = [(a.id, a.name) for a in Job.query.order_by(Job.name)]
    

    【讨论】:

    • 这在表单视图中有效,根据 tyan 的评论,我将超级移动到 init 的第一行。它在视图中也有点工作,但我遇到了验证问题(我正在使用 Flask-Appbuilder 的一部分,这可能会带来复杂性)。
    • 很好的答案!但是如果我想在模板中添加选定的值怎么办?
    【解决方案2】:

    值得一提的是@plaes的部分答案是错误的

    def __init__(self, *args, **kwargs):
            super(UserForm, self).__init__(*args, **kwargs)
            self.job.choices = [(a.id, a.name) for a in Job.query.order_by(Job.name)]
    

    在 init func 中我们应该先调用 super 。然后使用 self.job.choices 否则它将不起作用..

    在这里查看我的问题flask wtforms selectfield choices not update

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 2012-12-07
      • 2020-06-03
      • 2018-12-24
      • 2011-08-17
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多