Ya que tenemos la lista de artículos funcionando, ahora es momento de aprender a mostrar información detallada de cada uno. En esta lección vamos a ver cómo configurar rutas que reciban parámetros dinámicos (como el ID de un artículo), cómo capturar ese valor en una vista y cómo mostrar el contenido correspondiente usando plantillas.
¿Qué es una ruta dinámica?
Así, en lugar de tener rutas fijas como /articles/1/ o /articles/100/, podemos crear una sola ruta que funcione para cualquier ID:
# urls.py
from django.urls import path
from codica_django_blog.article.views import IndexView, ArticleView
urlpatterns = [
path('', IndexView.as_view()),
path('<int:id>/', ArticleView.as_view()), # Ruta dinámica
]
Aquí estamos diciendo: “Cuando se reciba una URL que termine en un número, como /1/ o /42/, ejecutar la vista ArticleView y pasarle ese número como parámetro llamado id.”
Ejemplos de URLs que esta ruta acepta:
/articles/1/
/articles/100/
¿Cómo capturamos ese ID en la vista?
Ahora que la ruta le cede el ID a la vista, tenemos que capturarlo y usarlo para buscar el artículo en la base de datos.
# views.py
from django.shortcuts import render, get_object_or_404
from django.views import View
from codica_django_blog.article.models import Article
class ArticleView(View):
def get(self, request, *args, **kwargs):
# kwargs es un diccionario con los parámetros que vienen de la URL
# Extraemos el ID del parámetro 'id'
article = get_object_or_404(Article, id=kwargs['id'])
return render(request, 'articles/show.html', context={
'article': article,
})
Aquí pasa algo muy útil: Django guarda todos los parámetros que vienen desde la URL en un diccionario llamado kwargs. Podemos acceder a ellos usando el nombre que le dimos al parámetro en la ruta, en este caso, id.
get_object_or_404?
Alternativas como Article.objects.get(id=kwargs['id']) funcionan, pero si ese artículo no existe, Django lanza un error que no es el más claro. En cambio, con get_object_or_404, si el artículo no se encuentra, Django devuelve automáticamente una página de error 404. Así mantenemos el flujo de la aplicación limpio y profesional sin necesidad de escribir código extra para manejar errores.
Django también soporta rutas con múltiples parámetros dinámicos. Por ejemplo, para ver los comentarios de un artículo:
# urls.py
from codica_django_blog.article.views import ArticleCommentsView
urlpatterns = [
# ...
path('<int:article_id>/comments/<int:id>/', ArticleCommentsView.as_view()),
]
Aquí estamos pasando dos valores: el ID del artículo y el ID del comentario.
En la vista, seguiríamos accediendo a ellos con kwargs:
# views.py
from django.views import View
from django.shortcuts import render, get_object_or_404
from codica_django_blog.article.models import Comment
class ArticleCommentsView(View):
def get(self, request, *args, **kwargs):
# Buscamos el comentario correspondiente al artículo
comment = get_object_or_404(Comment, id=kwargs['id'], article__id=kwargs['article_id'])
return render(request, 'articles/comment.html', context={
'comment': comment,
})
Usamos un filtro doble: buscamos el comentario con el ID correcto que también pertenezca al artículo indicado. Así nos aseguramos de que todo está relacionado correctamente.
Mostrar el artículo en la plantilla
Finalmente, como ya hemos hecho anteriormente, podemos mostrar la información del artículo usando plantillas de Django:
<!-- templates/articles/show.html -->
{% extends "base.html" %}
{% block content %}
<h1>{{ article.name }}</h1>
<div>{{ article.body }}</div>
{% endblock %}
{{ article.name }}muestra el título del artículo.{{ article.body }}muestra el contenido.
Django se encarga de reemplazar esas variables con los datos reales que le pasamos desde la vista.
Resumen
- Una ruta dinámica en Django permite capturar parámetros directamente desde la URL, como el ID de un artículo.
- Los parámetros de la ruta llegan a la vista dentro del diccionario
kwargs. Se accede a ellos por su nombre. - La función
get_object_or_404intenta obtener un objeto del modelo. Si no lo encuentra, devuelve una página 404 automáticamente. - Podemos crear rutas con varios parámetros, y esos valores se reciben con sus respectivos nombres en la vista.
- Para mostrar los datos en HTML, usamos plantillas con variables incrustadas (por ejemplo
{{ article.name }}).
Trabajo independiente
- Realiza todos los pasos de la teoría. .
- Asegúrate de que al solicitar la página
/articles/se muestre el artículo específico - Haz que el nombre del artículo en la lista de artículos sea un enlace al artículo específico.
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.