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"
- ¿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
- ¿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"