Saltar a contenido

3.6 Parámetros en las Rutas

Introducción

En Django, las rutas permiten definir URLs que se vinculan a vistas específicas. A menudo, necesitamos parámetros en las rutas para hacerlas más dinámicas y que puedan responder a diferentes entradas. Los parámetros en las rutas permiten capturar valores directamente desde la URL, como identificadores de objetos, fechas, edades, nombres, entre otros.

Definición

Un parámetro en una ruta es una parte de la URL que se pasa como variable a una vista. Estos parámetros pueden ser valores como texto, números, fechas, etc., y nos permiten crear URLs dinámicas.


1. ¿Cómo se definen los parámetros en las rutas?

Para definir un parámetro en una ruta de Django, usamos la sintaxis de tipo <tipo:variable> dentro de la ruta en urls.py. Los tipos de parámetros más comunes son:

  • int: Para números enteros.
  • float: Para números decimales (el separador decimal es el punto .).
  • str: Para cadenas de texto.
  • slug: Para cadenas con caracteres alfanuméricos y guiones.
  • uuid: Para identificadores únicos universales (UUID).
  • date: Para fechas (en formato YYYY-MM-DD).

Ejemplo de parámetros en las rutas

1.1 Ruta con un parámetro entero

# urls.py
from django.urls import path
from . import views

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

Aquí, el parámetro id es un número entero que Django pasará a la vista articulo. Si se accede a la URL http://midominio.com/articulo/1, el valor de id será 1.

1.2 Ruta con un parámetro decimal

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('producto/<float:precio>/', views.producto, name='producto'),
]
En este caso, el parámetro precio es un número decimal. Si se accede a la URL http://midominio.com/producto/19.99, el valor de precio será 19.99.

1.3 Ruta con un parámetro de texto

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('usuario/<str:nombre>/', views.usuario, name='usuario'),
]

Aquí, el parámetro nombre es una cadena de texto. Si se accede a la URL http://midominio.com/usuario/juan, el valor de nombre será juan.


2. Añadiendo rutas con parámetros a nuestra aplicación

Vamos a añadir dos rutas a nuestro proyecto para saludar y verificar la edad de una persona. Empezaremos desde el archivo urls.py y crearemos las vistas correspondientes.

2.1 Ruta /adulto/edad

Queremos una ruta que nos diga si una persona es mayor de edad o no, en función de la edad que se pase como parámetro.

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('adulto/<int:edad>/', views.adulto, name='adulto'),
]

En este caso, el parámetro edad se espera como un número entero.

Vista en views.py:

1
2
3
4
5
6
7
8
# views.py
from django.http import HttpResponse

def adulto(request, edad):
    if edad >= 18:
        return HttpResponse("Eres mayor de edad")
    else:
        return HttpResponse("No eres mayor de edad")
  • Si se accede a la URL http://localhost:8000/adulto/20, el valor de edad será 20 y la respuesta será "Eres mayor de edad".
  • Si se accede a la URL http://localhost:8000/adulto/16, la respuesta será "No eres mayor de edad".

2.2 Ruta /saludo/nombre

Queremos una ruta que salude a la persona usando su nombre. En este caso, el parámetro será una cadena de texto.

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('saludo/<str:nombre>/', views.saludo, name='saludo'),
]

Vista en views.py:

# views.py
from django.http import HttpResponse

def saludo(request, nombre):
    return HttpResponse(f"Hola {nombre}!")
  • Si se accede a http://localhost:8000/saludo/pepe, la respuesta será "Hola Pepe!".

3. Conflicto entre rutas /saludo y /saludo/nombre

Conflicto en las rutas

Si añades la ruta /saludo/ tal como está:

path('saludo/', views.saludo, name='saludo'),

Y luego la ruta con un parámetro de nombre:

path('saludo/<str:nombre>/', views.saludo, name='saludo_nombre'),

Las rutas entran en conflicto, porque Django no sabe si debe utilizar la ruta sin parámetros o la ruta con parámetros.

Solución

La ruta sin parámetros debe definirse después de la ruta con parámetros. Django recorrerá las rutas de arriba hacia abajo, por lo que siempre debe estar primero la ruta con parámetros para que no haya ambigüedad.

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('saludo/<str:nombre>/', views.saludo, name='saludo_nombre'),  # Ruta con parámetro
    path('saludo/', views.saludo_generica, name='saludo_generica'),  # Ruta sin parámetro
]

De este modo, la ruta con parámetros saludo/<str:nombre>/ será capturada por el primer path, y la ruta sin parámetros será la última.


4. Ejercicio práctico

Crear una nueva ruta con parámetros

Crear varias rutas a las que les pasemos 2 números enteros.

  • sumar/num1/num2 → Devuelve la suma de los dos números.
  • restar/num1/num2 → Devuelve la resta de los dos números.
  • multiplicar/num1/num2 → Devuelve la multiplicación de los dos números.
  • dividir/num1/num2 → Devuelve la división de los dos números.

En la ruta de la división, si el segundo número es 0, debe devolver un mensaje indicando que no se puede dividir por cero.

Solución
solución
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# views.py
from django.http import HttpResponse
def sumar(request, num1, num2):
    resultado = num1 + num2
    return HttpResponse(f"La suma de {num1} y {num2} es {resultado}")
def restar(request, num1, num2):
    resultado = num1 - num2
    return HttpResponse(f"La resta de {num1} y {num2} es {resultado}")
def multiplicar(request, num1, num2):
    resultado = num1 * num2
    return HttpResponse(f"La multiplicación de {num1} y {num2} es       {resultado}")
def dividir(request, num1, num2):
    if num2 == 0:
        return HttpResponse("No se puede dividir por cero")
    resultado = num1 / num2
    return HttpResponse(f"La división de {num1} entre {num2} es {resultado}")

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('sumar/<int:num1>/<int:num2>/', views.sumar, name='sumar'),
    path('restar/<int:num1>/<int:num2>/', views.restar, name='restar'),
    path('multiplicar/<int:num1>/<int:num2>/', views.multiplicar, name='multiplicar'),
    path('dividir/<int:num1>/<int:num2>/', views.dividir, name='dividir'),
]

5. Resumen

En este tema, hemos aprendido cómo utilizar parámetros en las rutas de Django para crear URLs dinámicas. Los parámetros nos permiten hacer que nuestras vistas respondan a datos pasados por el usuario en la URL. También hemos visto cómo evitar conflictos de rutas y cómo gestionarlas correctamente. Estos parámetros permiten que las aplicaciones web sean más interactivas y útiles.