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

Enrutamiento Desarrollo con el framework Django

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.

Django usa una estructura especial llamada 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.

En las rutas no se incluye el dominio (como 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".

¿Y reverse_lazy?

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 urlpatterns para 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() y reverse_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:

  1. Haz que codica_django_blog.article.views.index reciba dos parámetros desde la URL: una cadena llamada tags y un entero llamado article_id, utilizando la ruta /articles/<tags>/<article_id>. La vista debe mostrar el texto como:
    Artículo número 42. Etiqueta python
  2. Asigna a esta vista el nombre "article".
  3. Haz que al abrir la página de inicio se redirija automáticamente a /articles/python/42. Para ello, usa las funciones redirect y reverse de 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.

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