HTML表中来自同一表单类的多个WTForm字段?

2024-04-25 14:28:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力找出如何实现与表中另一个元素关联的惟一表单字段实例。下面是一个人为的例子:

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')

我的模板:

^{pr2}$

在 在

很明显,在HTML中,每个表行中每个输入元素的name参数都是相同的,因为使用的是同一个表单字段,所以在“POST”中,如果输入电话号码,那么该电话号码现在将填充到表中的所有名称行中。“激活”复选框也是如此。我还尝试生成一个表单实例的列表并将该列表传递到模板中,但它似乎没有像我预期的那样工作。在这一点上,我的选择似乎是:

  1. 不要为此使用WTForms(请参阅下面的注释)
  2. 使用WTForms FieldList+FormField(我认为这也行不通,因为它们需要命名键而不是任意键,所以我会遇到完全相同的问题。)
  3. 以某种方式使用HiddenFields(甚至没有想过这将如何工作)。在

我知道,我可以通过模板将<input type>元素手动创建到表中,并基于w为它们分配不同的名称/id,但这感觉不太习惯,而且我必须自己在验证中编写代码。在


Tags: 实例namefromimportform模板app元素
1条回答
网友
1楼 · 发布于 2024-04-25 14:28:34

通常,您会将包含表单数据的multi dict对象作为表单的第一个参数传入:

form = UpdateWidgetForm(request.form)

这确实要求POST数据与表单中的小部件匹配;每个小部件都将检查多个dict,并使用一些预填充的数据提取出需要呈现的内容。在

或者,可以将值作为关键字参数传入,但这需要您自己验证输入,将任何值转换为正确的类型:

^{pr2}$

请参阅文档中的How Forms get data。在

如果您需要在一个页面中从同一个表单对象生成多个表单,每个表单都是唯一的,那么您需要给每个表单一个带有Form(prefix=..)参数的唯一前缀。在

相关问题 更多 >