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

Actualización (CRUD) Desarrollo con el framework Django

Ya sabes cómo crear artículos con formularios en Django. Ahora vamos un paso más allá: editar uno que ya existe.

La lógica es casi la misma que al crear, pero con un cambio clave: en lugar de empezar desde cero, buscamos el artículo en la base de datos y cargamos sus datos en el formulario.

Un asunto importante: la autorización

🔒 Antes de editar cualquier cosa, es bueno entender que no todos pueden hacerlo. Normalmente, solo el autor de una publicación puede modificarla. Esta verificación la controla un mecanismo llamado autorización, que garantiza que solo los usuarios con permiso puedan hacer ciertos cambios.

Django ya trae un sistema de autorización integrado y muy completo. No lo vamos a usar en este curso, pero si te interesa profundizar, puedes leer más en la documentación oficial de Django.


Lo que necesitamos para editar una entidad

Vamos a dividir la tarea en partes para que sea más clara:

  1. Crear un nuevo URL que apunte a una vista de edición.
  2. Crear la vista que cargue el formulario con los datos ya existentes.
  3. Crear o adaptar la plantilla para editar.
  4. Manejar el formulario cuando el usuario lo envía.

Crear el URL de edición

Vamos a configurar el archivo urls.py para definir una ruta nueva para editar artículos. La diferencia clave es que esta ruta incluye /edit/.

from django.urls import path
from codica_django_blog.article.views import (
    IndexView,
    ArticleFormView,
    ArticleFormEditView,  # <= nueva vista
)

urlpatterns = [
    # otras rutas...
    path('<int:id>/edit/', ArticleFormEditView.as_view(), name='articles_update'),
]
⚠️ Ojo: es importante que esta línea esté antes de la ruta que muestra un solo artículo. Si no, Django puede confundirse porque ambas usan <int:id>, y la que aparece primero se queda con el control.

Crear la vista para mostrar el formulario con datos

Ahora vamos a ver cómo se ve la lógica detrás del formulario de edición. Aquí está el método get() de nuestra vista:

class ArticleFormEditView(View):

    def get(self, request, *args, **kwargs):
        article_id = kwargs.get('id')  # tomamos el ID enviado en la URL
        article = Article.objects.get(id=article_id)  # buscamos el artículo
        form = ArticleForm(instance=article)  # instanciamos el formulario con la info del artículo
        return render(
            request,
            'articles/update.html',  # plantilla para editar
            {'form': form, 'article_id': article_id}
        )

Explicación:

  • Buscamos el artículo con ese id en la base de datos.
  • Creamos un formulario con los valores del artículo usando instance=article. Esto le dice a Django que queremos llenar el formulario con esa información.
  • Finalmente, mostramos ese formulario en la plantilla.

Crear la plantilla de edición (update.html)

La plantilla se parece mucho a la que usamos al crear. De hecho, podrías reutilizar casi todo si separas la estructura común.

{% if form.errors %}
  <div>
    <ul>
    {% for error in form.errors %}
      <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ul>
  </div>
{% endif %}

<form action="{% url 'articles_update' id=article_id %}" method="post">
  {% csrf_token %}
  <table style="border: 1px solid #3F3DFF; border-collapse: collapse; width: 100%; margin-bottom: 20px; max-width: 100%; table-layout: auto;">
    <thead>
      <tr>
        <th style="border: 2px solid #3F3DFF; padding: 10px; background-color: #E8F1FF; color: black; font-weight: bold; text-align: left;">Campo</th>
        <th style="border: 2px solid #3F3DFF; padding: 10px; background-color: #E8F1FF; color: black; font-weight: bold; text-align: left;">Valor</th>
      </tr>
    </thead>
    <tbody>
      {{ form.as_table }}
    </tbody>
  </table>
  <input type="submit" value="Guardar">
</form>

Cambios importantes respecto a la plantilla de creación:

  • El botón tiene otro nombre ("Guardar").
  • La dirección a la que se envía el formulario apunta a la ruta de actualización con el ID exacto del artículo.

Una buena práctica es dividir las partes comunes en un archivo de plantilla aparte, usando {% include %}. Así evitas repetir el mismo código en todos lados.


Procesar el formulario cuando lo envían

Finalmente, necesitamos manejar el envío del formulario con los cambios. Aquí está el método post():

def post(self, request, *args, **kwargs):
    article_id = kwargs.get('id')  # obtenemos el ID del artículo
    article = Article.objects.get(id=article_id)  # lo buscamos en la base de datos
    form = ArticleForm(request.POST, instance=article)  # vinculamos el formulario con POST y la instancia

    if form.is_valid():  # si todo está bien
        form.save()  # guardamos los cambios
        return redirect('articles')  # redireccionamos a la lista de artículos

    # si hay errores, volvemos a mostrar el formulario con errores
    return render(request, 'articles/update.html', {'form': form, 'article_id': article_id})

La lógica es muy parecida a la de creación, solo que en vez de crear un objeto nuevo, lo actualizamos:

  1. Buscamos el artículo por id.
  2. Creamos un formulario con los nuevos datos (request.POST) y decimos que se trata de una instancia existente (instance=article).
  3. Si es válido, lo guardamos.
  4. Si no, volvemos a mostrar el formulario con errores.

Resumen

  • Actualizar una entidad es muy parecido a crear una nueva pero con una diferencia clave: antes de mostrar el formulario, cargamos los datos existentes desde la base de datos usando instance.
  • Es importante definir el URL de edición antes que otros más generales para evitar conflictos en las rutas.
  • Django ofrece un sistema de autorización que permite controlar quién puede editar qué, aunque no lo cubrimos en esta lección.
  • Las plantillas de creación y edición pueden compartir mucho código. Usar {% include %} ayuda a mantenerlas organizadas.
  • En el post() de la vista, usamos tanto request.POST como instance para vincular los nuevos datos con el objeto ya existente.

¡Y listo! Ya puedes permitirle a tus usuarios editar contenidos que ya han creado. Esto es clave para cualquier aplicación dinámica o tipo blog.


Trabajo independiente

Editar artículos y validación

En esta actividad vas a practicar la edición de artículos y la validación en formularios. Sigue estos pasos:

  1. Realiza todos los pasos de la teoría.
  2. Agrega a la lista de artículos un enlace para editar cada artículo.
  3. Actualiza varios artículos desde la interfaz. Verifica que la validación funcione correctamente.
  4. 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