Я хочу создать динамическую c форму ввода и прочитать вводимые пользователем данные при нажатии кнопки («Отправить»). Каков наилучший (хороший способ) сделать это?
Я попытался создать динамическую форму c с помощью FieldList, но мне не удалось получить значения от пользователя. Это (надеюсь, весь) соответствующий код:
forms.py
class EntryForm(Form):
field = StringField()
class DynamicForm(FlaskForm):
parameter = FieldList(FormField(EntryForm), min_entries=1)
submit = SubmitField('Submit')
routes.py
@app.route("/new", method=['GET', 'POST'])
def new_form():
form = DynamicForm()
if form.validate_on_submit():
values = form.parameter #This does not work as intended.
do_stuff(values)
return redirect(url_for('index'))
parameter = utils.get_parameter()
return render_template('dynamic_form.html', form=form, parameter=parameter)
, где utils.get_parameter () возвращает неизвестный список параметров. Или, если быть точным, функция ожидает параметр и возвращает список, основанный на этом параметре, но я пропустил его здесь.
dynamic_form. html
{% extends "layout.html" %}
{% macro render_field(item) %}
<div class="form-group">
<label class="form-control-label">{{ item.label }}</label>
<input type="text" name="{{ item.name }}" class="form-control" value="{{ item.value }}"/>
</div>
{% endmacro %}
{% block content %}
<div class="content-section">
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset class ="form-group">
<legend class="border-bottom mb-4">Parameter</legend>
{% for item in form.parameter %}
{{ render_field(item) }}}
{% endfor %}
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</form>
</div>
{% endblock content %}
Я предполагаю, что это потому, что validate_on_submit () вызывается после создания формы (снова), и, следовательно, он не содержит полей формы, и особенно пользовательских вводов. Есть ли способ предотвратить эту «потерю данных» или это совершенно неправильный подход? Также сообщите мне, если информация отсутствует.