URLs#

Una url es una dirección web. Obviamente Django debe «reaccionar» cuando se accede a una determinada url de nuestro proyecto. La forma de «reaccionar» es desencadenar una serie de acciones que suelen estar empaquetadas en una vista.

Es decir, podríamos entender una url como el nexo de unión entre las indicaciones de un usuario final y las acciones implementadas en nuestro código.

Un fichero de URLs no es más que un fichero Python que incluye un listado de rutas asociadas con la vista correspondiente que se debe ejecutar.

URLs de primer nivel#

Ya hemos visto que, cuando se crea un proyecto Django, también se crean varios ficheros entre los que se encuentra un fichero urls.py.

Veamos su contenido:

musicalia/urls.py#
1from django.contrib import admin
2from django.urls import path
3
4urlpatterns = [
5    path('admin/', admin.site.urls),
6]

Este fichero representa las urls de primer nivel ya que son las primeras en analizar cuando llega una petición.

Analicemos cada línea por separado:

  • L1 → Importamos el módulo Django para la gestión de la interfaz administrativa.

  • L2 → Importamos la función Django para registrar urls.

  • L4 → Django espera encontrar en este fichero una variable con el nombre urlpatterns. Esta variable es una lista con las rutas.

  • L5 → Se usa la función path() para vincular la ruta con su url. En este caso concreto lo que se está haciendo es delegar las urls que «cuelgan» de admin/ al fichero urls.py dentro del módulo administrativo de Django admin.site.

Gracias a este fichero (que viene por defecto) podemos acceder a la interfaz administrativa de Django en la url /admin.

Creando URLs#

Vamos a empezar por el caso de uso en el que queremos listar todas las canciones que hay en el proyecto musicalia.

Dado que estamos trabajando con la aplicación tracks podríamos definir la url del listado de canciones en /tracks/

Incluyendo URLs#

Para empezar debemos indicar en las urls de primer nivel que todo aquello que empiece por /tracks sea gestionado por la propia aplicación tracks:

musicalia/urls.py#
1from django.contrib import admin
2from django.urls import include, path
3
4urlpatterns = [
5    path('admin/', admin.site.urls),
6    path('tracks/', include('tracks.urls')),
7]

Hemos añadido la L6 que incluye las urls de la aplicación tracks para aquellas rutas que estén bajo /tracks. Nótese que se ha usado la cadena de texto 'tracks.urls' en vez de importar directamente el módulo. Esto nos puede facilitar la creación de urls.

URLs de aplicación#

Ahora ya estamos en disposición de crear las urls propias de la aplicación tracks.

URL de listado#

Empezaremos por crear una url en la aplicación tracks de cara a mostrar un listado de todas las canciones.

Para ello debemos crear el fichero tracks/urls.py:

tracks/urls.py#
1from django.urls import path
2
3from . import views
4
5app_name = 'tracks'
6
7urlpatterns = [
8    path('', views.track_list, name='track_list'),
9]

Analicemos cada línea por separado:

  • L3 → Importamos las vistas de la aplicación actual (tracks).

  • L5 → Definimos el espacio de nombres [1] tracks para las urls de esta aplicación. Django espera ver una variable llamada app_name con esta interpretación.

  • L6Registramos la url usando la función path() y pasando estos tres argumentos:
    • '' Es la url que queremos gestionar. Al ser cadena vacía indicamos que se trata del raíz /. Pero ojo porque venimos de las urls de primer nivel. Por lo tanto en este caso estamos manejando la url /tracks/

    • views.track_list Es la vista que se lanzará si la url casa con el patrón indicado.

    • 'track_list' Es el nombre que le damos a esta url. Este argumento es muy importante ya que nos permite referenciar esta url sin tener que «hardcodear» la ruta. Dado que ya hemos dado un espacio de nombres, podemos hacer referencia a esta url con tracks:track_list.

Prudencia

A diferencia de otros ficheros, el archivo urls.py de cada aplicación no se crea cuando creamos una nueva aplicación Django.

URL de detalle#

Si damos un paso más podemos preparar una url en la que mostraremos el detalle de una canción en concreto:

tracks/urls.py#
 1from django.urls import path
 2
 3from . import views
 4
 5app_name = 'tracks'
 6
 7urlpatterns = [
 8    path('', views.track_list, name='track_list'),
 9    path('<pk>/', views.track_detail, name='track_detail'),
10]

En esta nueva línea introducida L9 nos damos cuenta de la existencia de un «parámetro» en la url identificado por <pk>. En este caso hace referencia a «primary key» (clave primaria) de la canción en cuestión.

Django pasa este parámetro pk a la vista para que pueda manejar el detalle de la canción correspondiente.

Conversores de rutas#

En una url podemos hacer uso de ángulos <> lo que nos permite introducir partes dinámicas en la url. Estos parámetros pueden venir precedidos por conversores de rutas mediante dos puntos :

En el caso de la url de detalle de cada canción vista anteriormente, podríamos haber incluido un conversor de ruta sobre la «primary key» de la canción [2]:

tracks/urls.py#
 7urlpatterns = [
 8    ...
 9    path('<int:pk>/', views.track_detail, name='track_detail'),
10]

Un conversor de ruta es una anotación en la que indicamos el tipo al que se debe convertir un determinado argumento de url cuando invocamos a la vista correspondiente. Adicionalmente permite establecer (y comprobar) el formato de entrada del citado argumento.

Conversores de ruta en Django#

Conversor

Descripción

Tipo devuelto

str

Cadena de texto

str

int

Valor entero

int

slug

Cadena de texto sin espacios

str

uuid

Identificador único

UUID

path

Cadena de texto incluyendo /

str

Truco

Si no especificamos conversor de ruta se aplicará por defecto str.