python flask flask-wtforms

python - Opciones dinámicas WTForms Flask SelectField



flask-wtforms (1)

Estoy tratando de pasar la variable de ID de usuario a WTForms con FlaskForms. Primero mostraré el código que funciona bien y luego lo que necesito modificar (esa parte no sé cómo). Estoy agregando un nuevo nombre asociado con algún grupo.

Modelo de matraz:

class AddName(FlaskForm): name =StringField(''Device name'', validators=[InputRequired(),Length(min=4, max=30)]) groupID = SelectField(''Payload Type'', choices=[(1,"Group1"),(2,"Group2")], validators=[InputRequired])

Ver modelo:

@app.route(''/dashboard/addname'', methods=[''GET'', ''POST'']) def addname(): form=AddName() if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return "New name added"

Modelo:

<form method="POST" action="/dashboard/addname"> <h2>Add name</h2> {{ form.hidden_tag() }} {{ wtf.form_field(form.name) }} {{ wtf.form_field(form.groupID) }} <button type="submit">Add name</button> </form>

Veo la lista correcta en el menú desplegable, y al enviar me da los números correctos.

Tarea: Necesito pasar una lista diferente basada en current_user.userID . Estoy formando una lista usando SQLAlchemy, haciendo una consulta desde la tabla desde DB, por lo que mi vista de Flask es:

@app.route(''/dashboard/addname'', methods=[''GET'', ''POST'']) def addname(): available_groups=db.session.query(Groups).filter(Groups.userID == currend_user.userID).all() #Now forming the list of tuples, so it''s ok for SelectField groups_list=[(i.groupID, i.groupName) for i in available_groups] form=AddName() if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return "New name added"

  1. ¿Cómo puedo pasar mi lista de grupos al formulario? Traté de implementar el procedimiento de formación en el modelo FlaskForm, pero no ve el objeto current_user
  2. ¿Necesito transformar groupID a string y luego volver a int cuando necesito pasarlo a SelectField como tuplas?

La idea principal aquí es asignar la lista de opciones al campo después de la creación de instancias. Para hacerlo, debe usar el argumento coerce=int . La palabra clave de coerción arg para SelectField dice que usamos int () para obligar a los datos del formulario. La coerción predeterminada es unicode ().

Formulario de modelo correcto:

class AddName(FlaskForm): name =StringField(''Device name'', validators=[InputRequired(),Length(min=4, max=30)]) groupID = SelectField(''Payload Type'', coerce=int, validators=[InputRequired])

Vista correcta

@app.route(''/dashboard/addname'', methods=[''GET'', ''POST'']) def addname(): available_groups=db.session.query(Groups).filter(Groups.userID == currend_user.userID).all() #Now forming the list of tuples for SelectField groups_list=[(i.groupID, i.groupName) for i in available_groups] form=AddName() #passing group_list to the form form.groupID.choices = groups_list if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return "New name added"