es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    ¡Parece que estás en el camino correcto! El problema principal con tu código es que request.POST debe ser reemplazado por request.form. Además, debes asegurarte de importar los módulos necesarios (FlaskForm, BooleanField, etc.) y pasar los argumentos apropiados a form = Prefs().

    Aquí tienes una versión actualizada de tu código:

    from flask_wtf import FlaskForm
    from wtforms import BooleanField
    
    def wrapper_func(list_a):
        class Prefs(FlaskForm):
            pass
    
        for ele in list_a:
            setattr(Prefs, ele, BooleanField(ele))
    
        form = Prefs()
        # realizar acciones de visualización con el formulario
    
        return form
    

    En esta versión, importamos FlaskForm y BooleanField de los módulos correspondientes. Luego, definimos wrapper_func, que recibe list_a y crea dinámicamente una nueva clase de formulario Prefs con un BooleanField para cada elemento en list_a. Finalmente, creamos una instancia del formulario usando form = 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!

Comments are closed.