Python 使用WTForms的动态选择字段未更新

Python 使用WTForms的动态选择字段未更新,python,flask,sqlalchemy,wtforms,flask-wtforms,Python,Flask,Sqlalchemy,Wtforms,Flask Wtforms,我试图使用wtforms和sqlalchemy创建一个动态选择字段,但当从数据库中插入或删除项目时,它不会更新。这是我的密码: class UserForm(Form): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) job = SelectField(

我试图使用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
类作业(db.Model):
id=db.Column(db.Integer,主键=True,自动递增=True)
name=db.Column(db.String)
定义初始化(self,name):
self.name=名称
定义报告(自我):
返回“%self.name”

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

创建表单对象时,应初始化表单选项:

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)]

值得一提的是,@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,否则它将不起作用


查看我的问题这里

这在表单视图中起作用,根据tyan的评论,我将super移到了init的第一行。它在视图中也可以工作,但我遇到了验证问题(我使用的是Flask Appbuilder的部分,这可能会带来复杂性)。回答得很好!但如果我想在模板中添加所选的值,该怎么做呢?