Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

318
Vistas
Formulario Flask-WTF con un número variable de campos (una lista de elementos)

Tengo un formulario para crear una receta de cóctel. Tiene algunos campos comunes como nombre, descripción y otros, y también una lista de ingredientes. Un ingrediente tiene una ID (clave externa para una tabla de ingredientes), como el valor de una etiqueta de select , un nombre y un campo numérico de cantidad , como entrada del usuario. Al principio, en el HTML solo hay un campo para un ingrediente; si el usuario desea agregar otro ingrediente a la receta, un botón 'Agregar ingrediente' crea otro campo, justo después del anterior.

¿Cómo puedo administrar este tipo de formulario con WTForms y Flask-WTF, en un backend de Python/Flask? Mi problema es: ¿cómo puedo decir en la clase de formulario "existe esta lista que debe tener al menos un elemento (un ingrediente) y no un máximo" para poder insertar correctamente la receta en la base de datos?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

tal vez crear una tercera mesa?

 Table 1 (Cocktail Table): cocktail_id cocktail_name Table 2 (Ingredients Table): cocktail_id ingredients_name Table 3 (Cocktail Ingredients Table): cocktail_ingredients_id cocktail_id ingredients_id quantity

Luego, para un cóctel determinado, busque en la tabla 3 todos los resultados de cocktail_id.
Puede unir internamente las otras tablas para obtener el nombre del ingrediente o el nombre del cóctel cuando sea necesario.

Al cargar a la base de datos, solo necesita crear una nueva entrada para cada ingrediente de cóctel que está guardando en la tabla de ingredientes de cóctel; con el cocktail_id, los ingredientes_id y la cantidad.

EDICIÓN 1: hay muchas cosas que podría hacer, por ejemplo, cuando está creando su formulario en su ruta, puede enviarle su cocktail_id, y luego, cuando esté creando su formulario, buscará todas las instancias de cocktail_id en su Tabla 3; y cree un nuevo (o conjunto de) campo(s) para cada resultado. Y en el momento en que el usuario presiona 'agregar ingrediente', puede enviarlos

 def createForm(cocktail_id): class FormClass(FlaskForm): # put your non dynamic fields here pass # add in your fields that are dependent on how many ingredients post_variables_list = [] # find all table 3 results for given cocktail table3_objects = Table3.query.filter_by(id=cocktail_id).all() for table3_object in table3_objects: setattr(FormClass, f'ingredientname_{table3_object.table3_id}', StringField('Ingredient Name', default=table3_object.ingredient_name)) post_variables_list.append(f'ingredientname_{table3_object.table3_id}') return FormClass(), post_variables_list @app.route('/example_route/<int:cocktail_id>') def example_route(cocktail_id): form, post_variables_list = createForm(cocktail_id) if request.method=='POST': submit_dictionary = {} submit_dictionary = form.data for current_variable in post_variables_list: fieldname, table3_id = current_variable.split('_') # find existing object, that you can create by redirecting to a different route # which just creates a new table 3 entry, which is associated w/ this cocktail each time you # press add ingredient and then redirects you to here table3_object = db.session.query(Table3).filter(Table3.id==table3_id).first() if fieldname = 'name': table3_object.name = submit_dictionary[current_variable] # could have other conditions here for other fields db.session.add(table3_object) db.session.commit() # route which just creates a new empty ingredient @app.route('create_new_empty_ingredient/int:cocktail_id') def create_new_empty_ingredient(cocktail_id): # create new entry in table 3 table3_object = Table3 ( cocktail_id = cocktail_id ) db.session.add(table3_object) db.session.commit() # redirect back to example_route return redirect(url_for('example_route', cocktail_id=cocktail_id))
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda