Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

CRUD: Creación Python: Desarrollo web con Flask

En este punto del curso, ya sabes cómo mostrar un listado de recursos (como una lista de usuarios) y cómo ver un recurso específico (como el detalle de un usuario). Ahora vamos a ver cómo crear un recurso desde cero, ese que todavía no existe en la base de datos.

En términos más sencillos, vamos a ver cómo mostrar una forma para que el usuario escriba los datos y cómo procesar esos datos cuando envía el formulario.

Vamos paso a paso.


¿Qué significa crear una entidad?

Imagínate que estás haciendo una aplicación para una escuela. Necesitas registrar nuevas escuelas, cursos o usuarios. Para eso, el usuario ve un formulario en pantalla, escribe los datos (por ejemplo, el nombre de la escuela) y luego le da clic a un botón para enviar esa información.

Esto requiere dos rutas diferentes:

  1. Una ruta GET que muestra el formulario vacío.
  2. Una ruta POST que recibe los datos del formulario y los guarda si todo está bien.

Veamos cómo serían esas rutas en diferentes ejemplos:

Recurso Ver formulario (GET) Procesar datos (POST)
Usuario /users/new /users
Curso /courses/new /courses
Usuario de empresa /companies/3/users/new /companies/3/users

Como ves, lo primero es mostrar el formulario y luego recibir la información enviada por el usuario.

image_processing.png


Paso 1: Mostrar el formulario

Vamos a ver cómo es el código en Flask para mostrar un formulario.

Ruta GET que muestra el formulario

@app.route('/schools/new')
def schools_new():
    school = []  # Los datos están vacíos porque el usuario aún no ha enviado nada
    errors = []  # Inicializamos la lista de errores vacía

    return render_template(
        'schools/new.html',
        school=school,
        errors=errors,
    )

El objetivo principal de este código es enviarle al navegador un formulario vacío para que el usuario lo llene. Por ahora, la variable school no tiene datos y errors también está vacía, ya que aún no hay errores de validación.

Plantilla HTML del formulario

<!-- archivo: schools/new.html -->

<form action="/schools" method="post">
    <div>
        <label>
            Nombre *
            <input type="text" name="name"
                   value="{{ school.name|default('', true) }}">
        </label>
        {% if errors %}
            <div>{{ errors.name }}</div>
        {% endif %}
    </div>

    <input type="submit" value="Crear">
</form>

Este formulario tiene un solo campo: el nombre de la escuela. Nota que:

  • Usamos value="{{ school.name|default('', true) }}" para que si el usuario vuelve a la página después de un error, no pierda lo que ya había escrito.
  • Si hay errores, mostramos el mensaje debajo del input.

Paso 2: Procesar los datos del formulario

Una vez que el usuario llena el formulario y presiona el botón, se dispara una solicitud POST. Esa solicitud llega a otro controlador que debe:

  • Extraer los datos del formulario
  • Validarlos
  • Guardarlos si todo está bien
  • Mostrar los errores si hay algo mal

Veamos cómo se hace.

Ruta POST para procesar el formulario

@app.post('/schools')
def schools_post():
    repo = SchoolRepository()

    # Obtener los datos del formulario
    data = request.form.to_dict()

    # Validar los datos
    errors = validate(data)
    if errors:
        # Hay errores: muestra el formulario con los errores
        return render_template(
            'schools/new.html',
            school=data,
            errors=errors
        ), 422  # HTTP 422 significa "Entidad no procesable"

    # Si todo está bien: guardar y redirigir
    repo.save(data)
    flash('La escuela ha sido creada correctamente', 'success')

    return redirect(url_for('schools_index'))  # Redirige a la lista de escuelas

¿Qué está haciendo este código?

  1. Usamos request.form.to_dict() para convertir los datos del formulario en un diccionario de Python.
  2. Llamamos a una función de validación (supongamos que se asegura de que el nombre no esté vacío, por ejemplo).
  3. Si hay errores, devolvemos el mismo formulario pero con los datos y errores para que el usuario los pueda corregir.
  4. Si todo está bien, guardamos los datos y redirigimos al usuario a la lista de recursos (schools_index), mostrando un mensaje con flash.

¿Y qué pasa si hay errores?

La lógica está pensada para no perder los datos que el usuario escribió. Si algo falla (por ejemplo, si el nombre está vacío), se vuelve a mostrar el formulario, con el valor ingresado y un mensaje de error justo al lado.

Esto le da una mejor experiencia a quien está llenando el formulario.


Resumen

  • Crear una entidad lleva dos pasos: mostrar el formulario (GET) y procesar los datos (POST).
  • El formulario HTML puede mostrar errores y mantener los valores ya escritos por el usuario.
  • Flask permite separar muy bien la lógica de mostrar el formulario y la de procesarlo.
  • Si hay errores, se vuelve a mostrar el formulario con los datos previos y los mensajes correspondientes.
  • Si los datos son correctos, se guardan en la base de datos y se redirige a la lista con un mensaje de éxito (flash).

En la próxima lección aprenderemos cómo actualizar una entidad existente usando formularios similares.


Trabajo independiente

  1. Implementa el procesamiento de los datos ingresados y el renderizado del formulario mostrando los errores.

image_processing_2.png

Aplicación de referencia

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY