- ¿Qué es el ruteo?
- Tipos de rutas
- Rutas dinámicas
- Agrupar rutas (Nested URL patterns)
- Obtener URLs reversamente
Ya estamos a mitad del curso, y es momento de abordar un tema esencial: cómo Django maneja las rutas de tu sitio.
Vamos a verlo paso a paso con ejemplos claros, para que entiendas cómo funcionan las URLs en Django y cómo conectarlas con tus vistas.
¿Qué es el ruteo?
Cuando un usuario visita tu sitio y escribe una URL como /productos/5/, Django necesita saber qué hacer con eso. Ahí es donde entra el sistema de rutas.
urlpatterns, que vive normalmente en el archivo urls.py. Ahí es donde definimos qué vista se debe ejecutar para cada ruta.
En comparación con Flask (donde usábamos decoradores como @app.route()), en Django se utiliza una mini sintaxis especial para describir esas rutas.
Tipos de rutas
En Django, las rutas pueden tener:
- Partes estáticas: que siempre son iguales, como
/contacto/ - Partes dinámicas: que cambian dependiendo del contenido, como
/user/42/
Rutas estáticas
Son rutas fijas. Por ejemplo, supongamos que tenemos una vista que muestra la página principal:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
Esta ruta se activa cuando el usuario accede a la página principal (/). Django revisa si la URL es exactamente igual a '' (una cadena vacía) y llama a la función index en el archivo views.py.
Otra ruta estática podría verse así:
path('acerca-de/', views.about)
Aquí la URL /acerca-de/ va directo a la vista about.
ejemplo.com). Así puedes mover tu app a distintos dominios sin modificar el sistema de rutas.
Rutas dinámicas
Las rutas dinámicas son súper útiles cuando trabajas con contenido que cambia, como usuarios o productos. Por ejemplo:
/users/42/pets/101/med_info/
Aquí tenemos varios datos en la URL:
- Usuario con ID 42
- Mascota con ID 101
- Queremos ver su información médica (
med_info)
En Django podemos capturar esos valores usando esta forma:
# urls.py
from django.urls import path
from .views import med_info_view
urlpatterns = [
path('users/<int:user_id>/pets/<int:pet_id>/med_info/', med_info_view),
]
Y en la vista:
# views.py
def med_info_view(request, user_id, pet_id):
# Aquí puedes usar user_id y pet_id
...
Django identifica que user_id y pet_id son enteros, los extrae de la URL y los pasa como argumentos a la función.
Tipos de variables en rutas
Django viene con varios tipos para declarar rutas dinámicas:
| Tipo | Significado | Ejemplo capturado |
|---|---|---|
| int | Entero positivo | 5, 42 |
| str | Cualquier texto (sin barras) | "bob", "info" |
| slug | Texto con letras, números, guiones | "producto-2023" |
| path | Texto que puede tener barras / |
"docs/intro/pdf" |
| uuid | Identificador UUID | "a87...e3d" |
Si necesitas más control, también puedes usar expresiones regulares.
Agrupar rutas (Nested URL patterns)
Cuando tu app crece, vas a notar que algunas rutas tienen partes comunes, por ejemplo todas las de usuarios comienzan con /users/.
En vez de repetir eso muchas veces, podemos usar include para dividir las rutas en módulos.
Ejemplo:
# project/users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.users_view),
path('<int:user_id>/pets/<int:pet_id>/med_info/', views.pet_med_info_view),
]
Y en la configuración principal del proyecto (project/urls.py):
from django.urls import path, include
urlpatterns = [
path('users/', include('project.users.urls')),
]
Así Django entiende que todas las URL que empiezan con /users/ deben mirar el archivo de rutas de users.
Esto funciona igual para otras secciones como el panel de administración:
path('admin/', admin.site.urls)
Obtener URLs reversamente
A veces desde una vista necesitas construir un enlace a otra página interna. Por ejemplo, un botón que lleve a la ficha médica de una mascota.
Si armas la URL manualmente, puede fallar si más adelante alguien cambia los nombres de las rutas. Para evitar eso, Django tiene la función reverse.
Primero, necesitas dar un nombre a esa ruta:
path(
'users/<int:user_id>/pets/<int:pet_id>/med_info/',
views.pet_med_info_view,
name='pet_med_info'
)
Ahora desde el código puedes hacer:
from django.urls import reverse
url = reverse('pet_med_info', kwargs={'user_id': 42, 'pet_id': 101})
# url queda igual a: '/users/42/pets/101/med_info/'
Esto se llama resolver la URL "al revés".
A veces necesitas crear una URL antes de que Django haya cargado todas sus configuraciones (por ejemplo, en clases). En esos casos, usas reverse_lazy, que crea una especie de promesa a futuro:
from django.urls import reverse_lazy
success_url = reverse_lazy('pet_med_info', kwargs={'user_id': 42, 'pet_id': 101})
Úsala especialmente en CBVs (Class Based Views), como:
class MiVista(View):
success_url = reverse_lazy('inicio')
Resumen
- Django usa
urlpatternspara mapear las URLs a vistas. - Hay dos tipos de rutas: estáticas (
/contacto/) y dinámicas (/user/42/). - Se usan path converters como
<int:user_id>o<str:username>para capturar datos desde la URL. - Puedes agrupar rutas por secciones usando
include()para mantener el código organizado. - Para construir URLs dentro del código, usas
reverse()yreverse_lazy()con el nombre de la ruta. - Nombrar las rutas con
name='nombre_ruta'es una buena práctica para mantener la flexibilidad.
Trabajo independiente
Manejo de parámetros en rutas y redirecciones
En esta actividad vas a trabajar con parámetros dinámicos en rutas y con redirecciones en Django. Sigue estos pasos:
- Haz que
codica_django_blog.article.views.indexreciba dos parámetros desde la URL: una cadena llamadatagsy un entero llamadoarticle_id, utilizando la ruta/articles/<tags>/<article_id>. La vista debe mostrar el texto como:
Artículo número 42. Etiqueta python - Asigna a esta vista el nombre
"article". - Haz que al abrir la página de inicio se redirija automáticamente a
/articles/python/42. Para ello, usa las funcionesredirectyreversede Django. No coloques la URL directamente: utiliza la ruta inversa.
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.