Если я устанавливаю значение по умолчанию при построении поля, все работает как ожидалось:
my_field = StringField("My Field: ", default="default value", validators=[Optional(), Length(0, 255)])
Однако, если я попытаюсь установить его программным образом, это не повлияет. Я попытался изменить метод __init__
следующим образом:
class MyForm(FlaskForm):
my_field = StringField("My Field: ", validators=[Optional(), Length(0, 255)])
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.my_field.default = "set default from init" # doesn't work
Это не устанавливает значение по умолчанию. Как я могу сделать это программно (потому что значение является динамическим на основе запроса к базе данных, и если я делаю это за пределами __init__
то он не получает самое последнее значение)?
Соответствующие версии из моего requirements.txt
:
Flask==0.12
Flask-WTF==0.14.2
WTForms==2.1
Кроме того, я запускаю Python 3.6, если это имеет значение.
В качестве альтернативы, я в порядке с решением, которое позволяет мне устанавливать значения данных для этого поля при начальной загрузке формы при добавлении новой записи (такое же поведение, как значение по умолчанию, указанное в конструкторе), но эта же форма также используется для редактирования так Я бы не хотел, чтобы он менял данные объекта, которые уже сохранены/сохранены при редактировании.
Вы можете установить начальные значения для полей, передав MultiDict
как FlaskForm
formdata
.
from werkzeug.datastructures import MultiDict
class MyForm(FlaskForm):
my_field = StringField("My Field: ", validators=[Optional(), Length(0, 255)])
form = MyForm(formdata=MultiDict({'my_field': 'Foo}))
Это установит значение ввода my_field
в значение "Foo" при визуализации формы, переопределяя значение по умолчанию для поля. Однако вы не хотите переопределять значения, когда форма отправляется обратно на сервер, поэтому вам нужно проверить метод запроса в вашем обработчике:
from flask import render_template, request
from werkzeug.datastructures import MultiDict
@app.route('/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
form = MyForm(formdata=MultiDict({'my_field': 'Foo'}))
else:
form = MyForm()
if form.validate_on_submit():
# do stuff
return render_template(template, form=form)
Вы можете получить доступ к своим полям в __init__
в качестве словаря:
class MyForm(FlaskForm):
def __init__(self, *args, **kwargs):
default_value = kwargs.pop('default_value')
super(MyForm, self).__init__(*args, **kwargs)
self['my_field'] = StringField("My Field: ", default=default_value,
validators=[Optional(), Length(0, 255)])
Вы бы назвали это следующим образом:
form = MyForm(default_value='Foo')
Дополнительную информацию и другие сведения см. В документации для класса wtforms.form.Form
.