"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Operaciones CRUD en Python y Django - Parte 2

Operaciones CRUD en Python y Django - Parte 2

Publicado el 2024-07-29
Navegar:832

En nuestro artículo anterior, cubrimos los conceptos básicos de la configuración de un proyecto Django y creamos nuestro modelo de ejercicio, que mostramos en la interfaz como una lista. En este artículo, profundizaremos en la realización de operaciones CRUD. Para aquellos que no están familiarizados, CRUD significa Crear, Leer, Actualizar y Eliminar, esencialmente las cuatro acciones fundamentales que puedes realizar con tus datos.

Ahora que tenemos nuestra API configurada en la carpeta aplicación , simplemente ampliaremos la vista de índice para manejar solicitudes de creación, actualización y eliminación.

La forma

Configuremos un formulario que permita a los usuarios crear ejercicios. Usaremos plantillas HTML para este propósito una vez más. Para comenzar, cree una nueva plantilla llamada add_exercise.html en la carpeta app/templates .

{% csrf_token %}

A continuación, en nuestra plantilla index.html, incluiremos la plantilla add_exercise.html usando el siguiente método:

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

Estamos utilizando la etiqueta include aquí, que promueve la componibilidad en las plantillas HTML, lo que hace que nuestro código sea más fácil de mantener y comprender. Si actualiza la página en su navegador, debería ver aparecer el formulario en la pantalla.

Add Exercise

En nuestro HTML, usamos la etiqueta 

 con el atributo método establecido en POST y el atributo acción apuntando a /, que es el mismo punto final que usamos para obtener la lista de ejercicios.

En este contexto, csrf_token es una característica de seguridad representada por un valor secreto generado aleatoriamente. Ayuda a proteger nuestros envíos de formularios contra ataques de falsificación, que es lo que CSRF significa: falsificación de solicitudes entre sitios. Se genera un token único para cada sesión de usuario y no es accesible desde sitios de terceros, lo que evita que se produzcan cambios no autorizados.

Nuestro formulario incluye dos campos de entrada: uno para el título y otro para la fecha, siguiendo el esquema de nuestro modelo de Ejercicio. Cuando se envía el formulario, los valores de título y fecha se enviarán mediante una solicitud POST al punto final /, que luego será procesado por nuestra vista de índice en app/views.py.

El modelo

En Django, podemos mejorar nuestro modelo de ejercicio (esencialmente una clase de Python) agregando métodos específicos que corresponden a operaciones CRUD. En el archivo app/models.py , incluiremos lo siguiente:

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

Podemos acceder al título y la fecha desde la solicitud POST, como se muestra en el código anterior. Luego, podemos utilizar el ORM integrado de Django para crear un nuevo ejercicio y devolver la instancia creada.

Aprovecharemos la misma vista de índice que usamos para recuperar ejercicios y la expandiremos para verificar si el método de solicitud es POST. Si es así, pasaremos el objeto de solicitud al método de clase que definimos previamente. Una vez creado el ejercicio, redireccionaremos al usuario a la página de inicio o actualizaremos la página, asegurando que el ejercicio recién agregado aparezca en la pantalla.

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Intenta crear un nuevo ejercicio ahora y deberías verlo aparecer al final de la lista.

Ejercicio de actualización

Refactoricemos un poco nuestro código antes de agregar la funcionalidad de actualización a los ejercicios. Moveremos los ejercicios a su propia plantilla llamada ejercise.html.

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

Cree una plantilla para ejercicio.html en la carpeta app/templates y le agregaremos el siguiente HTML:

{% csrf_token %}

Estamos usando la etiqueta 

 nuevamente para cada ejercicio de la lista y agregando una entrada oculta para exercise.id, que se usará para actualizar el ejercicio. Vuelva al navegador y actualice la página; Deberías ver un formulario para cada ejercicio de la lista, con cada entrada precargada con los datos del ejercicio correspondiente.

CRUD Operations In Python & Django - Part 2

Observe que no utilizamos PUT como método de formulario; en su lugar, utilizamos POST. Esto se debe a que los controladores de vista solo pueden analizar los datos enviados a través de solicitudes GET y POST , sin soporte integrado para PUT y DELETE. Cuando creamos el método crear clase en la clase Ejercicio, habrás notado que usamos request.POST.get('title'). Si bien esto funciona para solicitudes POST, no hay métodos PUT o DELETE disponibles en el objeto de solicitud.

Pero, ¿cómo diferenciamos entre una solicitud POST y una PUT ? Si revisa el formulario que creamos anteriormente, notará que asignamos un atributo de nombre al botón de enviar. Podemos acceder a este atributo de la misma manera que accedimos al título y la fecha, usando request.POST.get('update').

Actualicemos el formulario de creación de ejercicios para incluir el mismo cambio.

...

Y en nuestra vista de ejercicios, haremos los siguientes cambios para diferenciar entre solicitudes.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Verificamos el nombre del botón y reenviamos la solicitud al método de ejercicio apropiado en consecuencia.

Agreguemos un método de clase de actualización al modelo de ejercicio en app/models.py.

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

Para actualizar una fila en la base de datos, podemos usar el método de actualización disponible en el modelo de ejercicio. Sin embargo, antes de actualizar, debemos asegurarnos de que estamos actualizando el ejercicio correcto. Para ello, filtramos los ejercicios por la clave principal, que es id, y actualizamos solo ese ejercicio específico.

Eliminar ejercicio

Del mismo modo, agregaremos un botón de eliminación junto a cada ejercicio en la plantilla ejercicio.html.

...

Estableceremos eliminar como el valor del atributo de nombre y, en views.py, ampliaremos las declaraciones if...elif para manejar la operación de eliminación.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Y en el modelo de ejercicio, agregaremos el método de clase eliminar.

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

Con esta incorporación, hemos implementado con éxito operaciones CRUD en nuestra aplicación Python y Django.

Conclusiones clave

  1. Los controladores de vista de Django no admiten solicitudes PUT y DELETE, ya que no analizan los parámetros de consulta ni el cuerpo de la solicitud para esos métodos HTTP. Como resultado, debemos confiar en las solicitudes POST y diferenciarlas pasando un campo adicional en el cuerpo de la solicitud.
  2. Noté que estoy realizando la solicitud POST a la misma ruta desde la que estoy obteniendo los ejercicios. Esto es importante porque si creara un punto final como /api/exercises para manejar las solicitudes, necesitaría administrar la redirección manualmente. De lo contrario, el comportamiento de la etiqueta
    después de la solicitud es redirigir al usuario al punto final especificado en el atributo de acción. Por lo tanto, deberá redirigir manualmente al usuario a la página deseada o, en nuestro caso, mantener al usuario en la misma página.
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

En resumen, al administrar eficazmente nuestras solicitudes POST y garantizar la redirección adecuada, podemos crear una experiencia de usuario perfecta al implementar operaciones CRUD en nuestra aplicación Django.

Declaración de liberación Este artículo se reproduce en: https://dev.to/prvnbist/crud-operatives-in-python-django-part-2-4fad?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3