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.
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.
urls.py# 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 contexto, 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'.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.
# 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.
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.
Los parámetros en las URLs se capturan utilizando los corchetes <>.
# 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.
Dentro de la vista, podemos acceder al parámetro capturado en la URL como parte de los argumentos de la función:
# 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}) 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.# myapp/urls.py
urlpatterns = [
path('post/<slug:slug>/', views.post_detail, name='post_detail'),
] 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.
from django.shortcuts import redirect
def my_view(request):
return redirect('index') # Redirige a la vista llamada 'index' from django.shortcuts import redirect
def redirect_to_post(request, post_id):
return redirect('post_detail', id=post_id) # Redirige con parámetro `id` 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).
404# 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:
# myapp/urls.py
handler404 = 'myapp.views.custom_404' 500# 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:
# myapp/urls.py
handler500 = 'myapp.views.custom_500' Http404Django también incluye una clase Http404 para lanzar un error 404 explícitamente si un recurso no se encuentra:
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}) # 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) # urls.py
path('post/<slug:slug>/', views.post_detail, name='post_detail'), # views.py
from django.shortcuts import redirect
def redirect_to_external_site(request):
return redirect('https://www.ejemplo.com')