URLs y Enrutamiento en Django: Guía Completa

En Django, el enrutamiento es el proceso que permite asociar las URLs con las vistas correspondientes en la aplicación. El sistema de enrutamiento de Django está basado en un archivo de configuración llamado urls.py, donde se definen las rutas para las vistas de la aplicación.

Configuración de URLs

Django utiliza un sistema de enrutamiento basado en expresiones regulares para definir las rutas. La configuración de URLs se maneja en el archivo urls.py de cada aplicación.

Estructura Básica de urls.py

python
# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
  path('', views.index, name='index'),
  path('about/', views.about, name='about'),
]

En este ejemplo, definimos dos rutas:

  • '/' que está asociada a la vista index y tiene el nombre de URL 'index'.
  • '/about/' que está asociada a la vista about y tiene el nombre de URL 'about'.

Configuración de URLs en el Proyecto

Cada aplicación tiene su propio archivo urls.py, pero también es necesario configurar un archivo principal urls.py en el proyecto para incluir las URLs de cada aplicación.

python
# project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', include('myapp.urls')),
]

Aquí, incluimos las URLs de la aplicación myapp dentro del archivo principal del proyecto.

Parámetros en URLs


Django permite capturar parámetros dentro de las URLs utilizando expresiones regulares o conversores de parámetros en las rutas. Estos parámetros se pasan a las vistas como argumentos.

Parámetros en las URLs

Los parámetros en las URLs se capturan utilizando los corchetes <>.

python
# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
  path('post/<int:id>/', views.post_detail, name='post_detail'),
]

Para este ejemplo, estamos capturando un parámetro id de tipo int en la URL. Este parámetro será pasado a la vista post_detail como un argumento.

Accediendo a los Parámetros en la Vista

Dentro de la vista, podemos acceder al parámetro capturado en la URL como parte de los argumentos de la función:

python
# myapp/views.py
from django.shortcuts import render

def post_detail(request, id):
  # Aquí, `id` es el parámetro capturado de la URL
  post = Post.objects.get(id=id)
  return render(request, 'post_detail.html', {'post': post})

Conversores de Parámetros

Django incluye varios conversores de parámetros que puedes usar en las rutas, tales como:

  • int: para enteros.
  • slug: para slugs de URL.
  • str: para cadenas de texto.
  • uuid: para identificar UUIDs.
python
# myapp/urls.py
urlpatterns = [
  path('post/<slug:slug>/', views.post_detail, name='post_detail'),
]

Redirecciones en Django

Django proporciona la función redirect() para redirigir al usuario a otra URL. Las redirecciones se pueden realizar a una vista por su nombre, una URL o una URL absoluta.

1Redirección Básica

python
from django.shortcuts import redirect

def my_view(request):
  return redirect('index')  # Redirige a la vista llamada 'index'

2Redirección con Parámetros

python
from django.shortcuts import redirect

def redirect_to_post(request, post_id):
  return redirect('post_detail', id=post_id)  # Redirige con parámetro `id`

Manejo de Errores en Django

Django permite gestionar los errores mediante vistas personalizadas para códigos de estado HTTP como el 404 (no encontrado) o el 500 (error interno del servidor).

Vista Personalizada para el Error 404

python
# myapp/views.py
from django.shortcuts import render

def custom_404(request, exception):
  return render(request, '404.html', status=404)

En el archivo urls.py de la aplicación, se debe asociar esta vista al manejo de errores 404:

python
# myapp/urls.py
handler404 = 'myapp.views.custom_404'

Vista Personalizada para el Error 500

python
# myapp/views.py
def custom_500(request):
  return render(request, '500.html', status=500)

En el archivo urls.py de la aplicación, se debe asociar esta vista al manejo de errores 500:

python
# myapp/urls.py
handler500 = 'myapp.views.custom_500'

Manejo de Errores con Http404

Django también incluye una clase Http404 para lanzar un error 404 explícitamente si un recurso no se encuentra:

python
from django.http import Http404
from django.shortcuts import render

def post_detail(request, id):
  try:
      post = Post.objects.get(id=id)
  except Post.DoesNotExist:
      raise Http404("Post no encontrado")
  
  return render(request, 'post_detail.html', {'post': post})

Casos de Uso Comunes


1Redirigir a una Vista con un Parámetro

python
# views.py
from django.shortcuts import redirect

def user_profile(request, user_id):
  # Lógica para procesar la vista
  return redirect('profile', id=user_id)

2Configurar una Ruta para un Slug

python
# urls.py
path('post/<slug:slug>/', views.post_detail, name='post_detail'),

3Redirigir a una URL Absoluta

python
# views.py
from django.shortcuts import redirect

def redirect_to_external_site(request):
  return redirect('https://www.ejemplo.com')