【问题标题】:How can I read user inputs from a dynamically created form in flask?如何从烧瓶中动态创建的表单中读取用户输入?
【发布时间】:2020-08-06 14:01:42
【问题描述】:

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

我尝试使用 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() 是在构造表单之后(再次)调用的,因此它不包含表单字段,尤其是不包含用户输入。有没有办法防止这种“数据丢失”或者这是一种完全错误的方法? 另外,如果信息缺失,请告诉我。

【问题讨论】:

    标签: python-3.x flask jinja2 flask-wtforms


    【解决方案1】:

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

    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”。重定向并不重要,重要的是,我有 do_stuff(values) 调用的值。
    • 我尝试了你的建议,但它并没有改变行为。我唯一的问题是,如何从表单的输入中获取值?目前,如果我在 validate_on_submit() 下方调用 form.parameter.entries,它只会返回我在 DynamicForm 类中定义的虚拟 parameter
    猜你喜欢
    • 2016-12-23
    • 2020-04-20
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多