Как я могу прочитать вводимые пользователем данные из динамически созданной формы в flask? - PullRequest
1 голос
/ 06 августа 2020

Я хочу создать динамическую 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 () вызывается после создания формы (снова), и, следовательно, он не содержит полей формы, и особенно пользовательских вводов. Есть ли способ предотвратить эту «потерю данных» или это совершенно неправильный подход? Также сообщите мне, если информация отсутствует.

1 Ответ

0 голосов
/ 06 августа 2020

Вы не хотите проверять форму при первой загрузке страницы. Сначала попробуйте следующее:

if request.method == "POST" and form.validate_on_submit():
    values = form.parameter 
    do_stuff(values)
    return redirect(url_for('index'))

Затем обратите внимание, что вы перенаправляете их в свое представление для def index():. Вы этого хотите?

...