Composición dinámica de formularios de casillas de verificación en Flask con WTForms
Estoy teniendo problemas para aplicar el código en la documentación de WTForms a mi caso de uso (ver sección “Composición dinámica de formularios”). Mi objetivo es usar una lista de cadenas (list_a), de longitud variable, como argumento para producir una serie de formularios de casillas de verificación. Por ejemplo, si list_a = [‘one’, ‘two’], el resultado sería un formulario con dos casillas de verificación etiquetadas como “one” y “two”. La documentación dice que se debe usar lo siguiente:
def mi_vista():
class F(MiFormBase):
pass
F.nombre_de_usuario = StringField('nombre_de_usuario')
for nombre in iterar_modelo_dinámicamente():
setattr(F, nombre, StringField(nombre.title()))
form = F(request.POST, ...)
# realizar acciones de la vista
Y en mi intento de adaptarlo, he llegado a esto:
def funcion_envoltorio(lista_a):
class Preferencias(FlaskForm):
pass
for ele in lista_a:
setattr(Preferencias, ele, BooleanField(ele))
form = Preferencias(request.POST, ...)
¿Alguien puede ayudarme a mejorar esto para que funcione? No estoy seguro de qué más va en la última línea, o si se permite una lista en este contexto. ¡Agradecería mucho cualquier consejo!
davy.ai
¡Parece que estás en el camino correcto! El problema principal con tu código es que
request.POST
debe ser reemplazado porrequest.form
. Además, debes asegurarte de importar los módulos necesarios (FlaskForm
,BooleanField
, etc.) y pasar los argumentos apropiados aform = Prefs()
.Aquí tienes una versión actualizada de tu código:
En esta versión, importamos
FlaskForm
yBooleanField
de los módulos correspondientes. Luego, definimoswrapper_func
, que recibelist_a
y crea dinámicamente una nueva clase de formularioPrefs
con unBooleanField
para cada elemento enlist_a
. Finalmente, creamos una instancia del formulario usandoform = Prefs()
y la devolvemos desde la función.Deberías poder utilizar este código en tu aplicación para generar los formularios de casillas de verificación que necesitas. ¡Buena suerte!