Могу ли я установить значение по умолчанию для StringField вне конструктора поля?

1

Если я устанавливаю значение по умолчанию при построении поля, все работает как ожидалось:

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, если это имеет значение.

В качестве альтернативы, я в порядке с решением, которое позволяет мне устанавливать значения данных для этого поля при начальной загрузке формы при добавлении новой записи (такое же поведение, как значение по умолчанию, указанное в конструкторе), но эта же форма также используется для редактирования так Я бы не хотел, чтобы он менял данные объекта, которые уже сохранены/сохранены при редактировании.

  • 0
    Вы хотите сделать что-то подобное? stackoverflow.com/a/51579212/5320906
  • 0
    @snakecharmerb Я так думаю, но это выглядит немного по-другому, так как кажется, что есть две разные формы (NewForm и Foo), тогда как у меня есть только одна форма, но я просто хочу динамически установить значение по умолчанию для одного поля. Посмотрим, смогу ли я заставить его работать и дам вам знать.
Показать ещё 3 комментария
Теги:
flask
flask-wtforms
python-3.6
wtforms

2 ответа

2
Лучший ответ

Вы можете установить начальные значения для полей, передав 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)
0

Вы можете получить доступ к своим полям в __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.

  • 0
    Это не работает Он говорит: «TypeError: Поля не могут быть добавлены к экземплярам Form, только к классам». Но, возможно, я неправильно понял, как я объявил поле в предыдущей области, а затем переопределил - определяю его только тогда, когда вы получаете аргумент по умолчанию (мне нужно, чтобы это поле присутствовало независимо от того, какая форма используется для добавления / редактирования, но по умолчанию следует заполнять только при добавлении, что является стандартным поведением)? Я был бы счастлив, если бы средство просто заполняло данные значения только тогда, когда форма используется для добавления новой записи - мне не нужно использовать опцию конструктора по умолчанию.
  • 0
    Этот ответ все еще устанавливает его с помощью конструктора, чего я и стараюсь избегать. Я хочу построить поле и установить его значение по умолчанию после этого, или, по крайней мере, обновить его значения данных при начальной загрузке формы, если пустая форма (без заполнения объекта, т. Е. При добавлении новой записи). Кроме того, я не всегда буду передавать это ключевое слово, в этом случае это вызовет KeyError.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню