Varias instancias del mismo campo de formulario.

Tengo el formulario de invitación con dos campos definidos como persona y correo electrónico de la siguiente manera:

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) 

Donde validate_form function es un validador de cusotm que verifica algunas condiciones para la invitación.

Mi requisito es permitir que los usuarios inviten a más de una persona a la vez. Para lograr esto, he agregado la función jquery que replica estos campos en formato html y permito invitar a varias personas.

Pero el problema está en mi función de vista cuando extraigo los resultados de la solicitud de publicación, ya que solo proporciona información para las primeras personas. ¿Cómo puedo obtener todos los detalles de las personas. Mi vista se define de la siguiente manera:

 @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 

Esto da solo un campo, en lugar de una matriz de campos.

¿Es esto posible con python wtf? ¿Cómo?

Lo que estás buscando es FormField que te permite crear una lista de los campos WTF (o incluso de grupos).

Aquí hay un ejemplo simple: representará tres campos de cadena como una lista html porque ese es el mínimo requerido. Si desea agregar extras a través de javascript, entonces solo siga el mismo esquema de nombres, en el caso a continuación, un cuarto tendría un nombre de 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.hidden_tag() }} {{ form.person }}
""", form=form) if __name__ == '__main__': app.run(debug=True)