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

Eliminación (CRUD) Desarrollo con el framework Django

🗑️ En esta lección vamos a hablar de cómo eliminar entidades (por ejemplo, artículos) dentro de una aplicación web usando Django. Eliminar un objeto es una de las operaciones más comunes del ciclo CRUD (Crear, Leer, Actualizar, Eliminar), y aunque suena sencillo, tiene sus detalles.

Vamos a ver paso a paso cómo implementar correctamente una funcionalidad de eliminación en Django usando métodos seguros.


¿Qué es eliminar en el contexto web?

Eliminar una entidad significa quitarla completamente de la base de datos. Pero cuando hablamos de aplicaciones web, debemos tener en cuenta también el tipo de solicitud o request HTTP que usamos.

En teoría, el navegador debería enviar una solicitud DELETE; sin embargo, Django (como muchos frameworks web en Python) solo recibe peticiones GET y POST directamente desde formularios HTML. Por eso, para manejar correctamente una eliminación, usamos un formulario con el método POST que esté conectado a una vista que haga el trabajo de eliminar.


Agregar la ruta (URL)

Como siempre, lo primero es decirle a Django qué URL debe activar la acción de eliminar. Para eso abrimos el archivo urls.py y añadimos una nueva ruta.

# urls.py
from django.urls import path
from codica_django_blog.article.views import IndexView, ArticleFormView, ArticleFormEditView, ArticleFormDeleteView

urlpatterns = [
    # ...
    path('<int:id>/delete/', ArticleFormDeleteView.as_view(), name='articles_delete'),
]

Esta línea define una ruta dinámica que captura el id del artículo a eliminar y lo pasa a la vista ArticleFormDeleteView.


Programar la vista

La vista es quien se encarga de buscar la entidad en la base de datos y eliminarla. Como esto solo debe hacerse con POST (no queremos borrar artículos por accidente), colocamos la lógica dentro del método post():

# views.py
from django.views import View
from django.shortcuts import redirect
from codica_django_blog.article.models import Article

class ArticleFormDeleteView(View):

    def post(self, request, *args, **kwargs):
        article_id = kwargs.get('id')
        article = Article.objects.get(id=article_id)
        if article:
            article.delete()
        return redirect('articles')  # Redirige al listado de artículos

💡 Nota:

  • Usamos .get(id=article_id) para buscar el artículo.
  • Si existe, lo eliminamos con .delete().
  • Luego redirigimos al usuario a la lista de artículos (articles es el nombre de la ruta del listado).

Agregar un formulario de eliminación

Ahora viene una parte importante: cómo mostrar la opción de eliminar en la interfaz de usuario sin usar un enlace directo.

Usar un enlace como <a href="/articles/123/delete/">Eliminar</a> suena cómodo pero no es seguro. Los navegadores o buscadores pueden seguir esos enlaces automáticamente, y no queremos eliminar cosas sin intención. Por eso usamos un formulario POST.

&lt;!-- somewhere in article_detail.html --&gt;

&lt;form action="{% url 'articles_delete' article.id %}" method="post"&gt;
    {% csrf_token %}
    &lt;input type="submit" value="Eliminar"&gt;
&lt;/form&gt;

Explicación:

  • action: apunta a la URL del artículo a eliminar.
  • method="post": evita accesos accidentales por GET.
  • {% csrf_token %}: Django exige este token de seguridad contra ataques CSRF (Cross-Site Request Forgery).
  • El botón envía el formulario.

¿Qué pasa con las dependencias?

En la vida real, los datos en una base de datos están relacionados. Por ejemplo:

  • Un artículo puede tener varios comentarios.
  • Un curso puede tener múltiples lecciones.

Entonces, si eliminas el artículo, ¿qué pasa con sus comentarios?

Hay varias estrategias:

Estrategia Descripción
Eliminar en cascada Se borra el artículo y también todos sus comentarios.
Separar la relación Los comentarios quedan sin dueño pero se mantienen.
Prevenir la eliminación No se permite borrar si tiene dependencias.
Eliminación suave El artículo no se borra, solo se marca como inactivo.

La más avanzada es la “eliminación suave”. Consiste en agregar un campo como is_deleted = models.BooleanField(default=False) en el modelo y no mostrar las entidades marcadas como eliminadas, pero manteniéndolas en la base de datos (útil si se necesita restaurarlas después).


Resumen

  • Eliminar en Django se hace por seguridad usando formularios con method="post".
  • Agregamos una nueva ruta que recibe el id del artículo.
  • Creamos una vista basada en clases para manejar el post() y eliminar el objeto.
  • Usamos formularios, no enlaces, para evitar eliminaciones accidentales.
  • En sistemas reales, considera cómo se manejan las relaciones entre entidades antes de eliminar.
  • La eliminación suave es común para evitar la pérdida permanente de datos.

Ahora puedes implementar la eliminación de entidades en tu aplicación Django de manera segura y con buenas prácticas.


Trabajo independiente

Implementar eliminación de artículos

En esta actividad trabajarás en la funcionalidad para eliminar artículos. Sigue estos pasos:

  1. Implementa la eliminación de artículos.
  2. Agrega un enlace para eliminar cada artículo en la lista de artículos.
  3. Intenta agregar por tu cuenta la visualización de mensajes flash.

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