Python 3.x 如何从flask中动态创建的表单读取用户输入?

Python 3.x 如何从flask中动态创建的表单读取用户输入?,python-3.x,flask,jinja2,flask-wtforms,Python 3.x,Flask,Jinja2,Flask Wtforms,我想创建一个动态输入表单,并在按下按钮(“提交”)时读取用户输入,最好的方法是什么 我曾尝试使用字段列表创建动态表单,但无法从用户处获取值。 这是(希望是全部)相关代码: forms.py class EntryForm(Form): field = StringField() class DynamicForm(FlaskForm): parameter = FieldList(FormField(EntryForm), min_entries=1) submit = Su

我想创建一个动态输入表单,并在按下按钮(“提交”)时读取用户输入,最好的方法是什么

我曾尝试使用字段列表创建动态表单,但无法从用户处获取值。 这是(希望是全部)相关代码:

forms.py

class EntryForm(Form):
   field = StringField()

class DynamicForm(FlaskForm):
   parameter = FieldList(FormField(EntryForm), min_entries=1)
   submit = SubmitField('Submit')
@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)
routes.py

class EntryForm(Form):
   field = StringField()

class DynamicForm(FlaskForm):
   parameter = FieldList(FormField(EntryForm), min_entries=1)
   submit = SubmitField('Submit')
@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()返回未知的参数列表。或者确切地说,函数需要一个参数并返回一个基于此参数的列表,但我在这里省略了这一点

动态表单.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 %}
{%extends“layout.html”%}
{%macro render_字段(项)%}
{{item.label}
{%endmacro%}
{%block content%}
{{form.hidden_tag()}}
参数
{form.parameter%中的项的%s}
{{render_field(item)}}}
{%endfor%}
{{form.submit(class=“btn btn outline info”)}
{%endblock内容%}
我认为这是因为validate_on_submit()是在表单构造(再次)后调用的,因此它不包含表单字段,特别是不包含用户输入。有没有办法防止这种“数据丢失”或这是一种完全错误的方法?
另外,如果信息丢失,请告诉我。

您不想在页面首次加载时验证表单。先试试这个:

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

接下来,请注意,您正在将它们重定向到
def index():
的视图。这就是您想要的吗?

您不想在页面首次加载时验证表单。先试试这个:

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

接下来,请注意,您正在将它们重定向到
def index():
的视图。这就是您想要的吗?

谢谢您的回复,就我所知,validate_on_submit()的功能正是如此,它仅在请求方法为“POST”时进行验证。重定向并不重要,重要的是,我有dou stuff(values)调用的值。我尝试了你的建议,但它没有改变行为。我唯一的问题是,如何从表单的输入中获取值?当前,如果我调用
form.parameter.entries
在提交时验证()下面,它只返回我在DynamicForm类中定义的伪参数。感谢您的响应,提交时验证()的作用就我所知,它只在请求方法为“POST”时验证。重定向并不重要,重要的是,我有dou stuff(values)调用的值。我尝试了你的建议,但它没有改变行为。我唯一的问题是,如何从表单的输入中获取值?当前,如果我调用validate_on_submit()下面的
form.parameter.entries
,它只返回我在DynamicForm类中定义的伪参数。