同一表单字段的多个实例

sra*_*l07 5 python flask wtforms flask-wtforms

我有一个邀请表单,其中有两个字段定义为person和email,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

这只给出一个字段,而不是字段数组.

这可能与python wtf?怎么样?

Doo*_*beh 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)
Run Code Online (Sandbox Code Playgroud)