同一表单字段的多个实例

时间:2014-10-10 15:31:07

标签: python flask wtforms flask-wtforms

我邀请表单,其中两个字段定义为人员和电子邮件,如下所示:

class InviteForm(Form):
    person = TextField("person", validators=[validators.Required("Please enter persons name.")])
    email =  EmailField("email", validators=[validators.Required("Please enter valid email."), validators.Email("Please enter valid email.")])

    def validate(self):
        return validate_form(self)

其中validate_form函数是一个cusotm验证器,用于检查邀请的几个条件。

我的要求是允许用户一次邀请多个人。为了实现这一点,我添加了jquery函数,它以html格式复制这些字段,并允许邀请多个人。

但问题是在我的视图函数中,当我从post请求中提取结果时,它只给出了第一个人的信息。我怎样才能得到所有人的详细信息。我的观点定义如下:

@app.route("/invite", methods=["GET", "POST"])
def invite():
   invite_form = InviteForm()
   if invite_form.validate_on_submit():
       print invite_form.person
       print invite_form.email

这只提供一个字段,而不是字段数组。

这可能与python wtf一起使用吗?怎么样?

1 个答案:

答案 0 :(得分:6)

您正在寻找的是FormField,它可以让您构建WTF字段列表(或甚至是组)。

这是一个简单的例子 - 它将三个字符串字段呈现为html列表,因为它是最低要求。如果你想通过javascript添加额外内容,那么只需遵循相同的命名方案,在下面的情况中,第四个名称为person-3

from flask import Flask, render_template_string
from flask.ext.wtf import Form
from wtforms import FieldList, StringField

app = Flask(__name__)
app.secret_key = 'TEST'


class TestForm(Form):
    person = FieldList(StringField('Person'), min_entries=3, max_entries=10)
    foo = StringField('Test')


@app.route('/', methods=['POST', 'GET'])
def example():
    form = TestForm()
    if form.validate_on_submit():
        print form.person.data
        ## [u'One', u'Two', u'Three']

    return render_template_string(
        """
            <form method="post" action="#">
            {{ form.hidden_tag() }}
            {{ form.person }}
            <input type="submit"/>
            </form>
        """, form=form)


if __name__ == '__main__':
    app.run(debug=True)