- ¿Qué es eliminar en el contexto web?
- Agregar la ruta (URL)
- Programar la vista
- Agregar un formulario de eliminación
- ¿Qué pasa con las dependencias?
🗑️ 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?
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 (
articleses 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.
<!-- somewhere in article_detail.html -->
<form action="{% url 'articles_delete' article.id %}" method="post">
{% csrf_token %}
<input type="submit" value="Eliminar">
</form>
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
iddel 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:
- Implementa la eliminación de artículos.
- Agrega un enlace para eliminar cada artículo en la lista de artículos.
- 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.