【发布时间】:2014-03-15 13:35:42
【问题描述】:
我正在努力弄清楚如何完成与表格中的另一个元素相关联的独特表单字段实例。举一个人为的例子,下面是下面的代码:
from flask import Flask, render_template, request
from flask.ext.wtf import Form
from wtforms import TextField, BooleanField
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'secret'
class Person(Form):
fname = TextField('First Name')
phone = TextField('Phone Number')
email = TextField('Email Address')
active = BooleanField('Active')
@app.route("/", methods=['GET', 'POST'])
def guest():
names = ['Bob', 'Joe', 'Jason', 'John'] # this could be a list, or data returned from a db query, previous POST data, or whatever
form = Person()
if request.method == 'POST' and form.validate_on_submit():
return str(form.data)
return render_template('index.html', names=names, form=form)
if __name__ == "__main__":
app.run(host='0.0.0.0')
我的模板:
<html>
<body>
<form action="" method="post">
<table border="1">
<thead>
<tr>
<th>Name</th>
<th>Telephone Number</th>
<th>Email Address</th>
<th>Active</th>
</tr>
</thead>
<tbody>
{% for n in names %}
<tr>
<td>{{ n }}</td>
<td>{{ form.phone }}</td>
<td>{{ form.email }}</td>
<td>{{ form.active }}</td>
</tr>
{% endfor %}
</tbody>
</table>
很明显,在HTML中,每个表格行中每个输入元素的name参数都是相同的,因为使用的是相同的表单字段,所以“POST”,如果输入一个电话号码,那现在为表中的所有姓名行填充电话号码。 “激活”复选框也是如此。我还尝试生成表单实例列表并将该列表传递到模板中,但它似乎没有像我预期的那样工作。在这一点上,我的选择似乎是:
- 不要为此使用 WTForms(参见下面的注释)
- 使用 WTForms FieldList + FormField(我认为这也行不通,因为它们需要命名键而不是任意键,所以我会遇到完全相同的问题。)
- 以某种方式使用 HiddenFields(甚至没有想过这是如何工作的)。
我知道我可以通过模板手动将<input type> 元素创建到表中,并根据w 为它们分配不同的名称/ID,但这感觉不是很地道,而且我有自己在验证中编码。
【问题讨论】: