【发布时间】: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