I'm trying to make a dynamic select field using wtforms and sqlalchemy, but it doesn't update when an item is inserted or deleted from the database. Here's my code:
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)]
)
And the database model:
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
It successfully shows the jobs in the select field, but if you modify the table, it doesn't update, except if you completely restart the application.
You should initialize the form choices when the form object is created:
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)]
Or in the view:
form = UserForm()
form.job.choices = [(a.id, a.name) for a in Job.query.order_by(Job.name)]
tyan
It's worth mention that part of the answer of @plaes is wrong
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)]
in the init func we should call super first .then use self.job.choices or it will not work..
see my question here flask wtforms selectfield choices not update
来源:https://stackoverflow.com/questions/31619747/dynamic-select-field-using-wtforms-not-updating