Tema 5: URLs en Django

17/10/2022 · Actualizado: 28/03/2023

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Uno de los elementos más relevantes en un proyecto de Django es el fichero urls.py, donde podemos especificar cual es la relación entre una vista concreta y la url en la que aparece esa vista.

Además, se pueden usar diferentes patrones para generalizar las URLs y montar una estructura de URLs basadas en elementos variables.

Un ejemplo de generalización de urls es que se puede tener una base de datos con elementos almacenados por diferentes categorías y usar el campo categoría en las urls. Por ejemplo, en nuestro ejemplo de canciones, podríamos tener una base de datos con las canciones y montar una URL del tipo: paginaweb/genero/canción.

A continuación te explico detenidamente lo que puedes hacer en el fichero urls.py y como configurarlo correctamente.

Si no has visto el resto de temas del curso de Django, échales un ojo desde la página del curso!

Índice
  1. Configuración básica del fichero de Django: urls.py
    1. Importar el módulo de Django
    2. Variable de Django urlpatterns
  2. Patrones para URLs

Configuración básica del fichero de Django: urls.py

Django tiene un fichero de configuración de URLs llamado urls.py. Este fichero se encarga de mapear las URLs de tu aplicación a los Views. A continuación, te mostraré cómo configurar el fichero urls.py en Django.

Importar el módulo de Django

Antes de empezar a configurar el fichero urls.py, necesitas importar el módulo de Django. Django tiene un módulo llamado django.urls. Este módulo contiene la función path(), que se usa para mapear las URLs.

La función path() toma como argumentos la URL y la vista. La sintaxis para importar el módulo de Django es la siguiente:

from django.urls import path

Variable de Django urlpatterns

La forma de configurar las correspondencias entre vistas y urls, se hace incluyendo estos pares en una variable llamada urlpatterns, que tiene forma de array.

Una vez que hayas importado el módulo de Django, puedes empezar a configurar el fichero urls.py. La sintaxis para configurar el fichero urls.py es la siguiente:

urlpatterns = [
    path('URL/', 'vista'),
]

En la sintaxis anterior, URL es la URL de tu aplicación y vista es la vista que deseas asociar con esa URL. Si lo que quieres es asociar más de una URL con una vista, puedes usar la función path() varias veces. La sintaxis para asociar múltiples URLs con una vista es la siguiente:

urlpatterns = [
    path('URL1/', 'vista'),
    path('URL2/', 'vista'),
    ...
]

En la sintaxis anterior, URL1 y URL2 son las URLs de la aplicación y vista es la vista que se muestra cuando se accede a esas URLs.

Además, Django proporciona una vista llamada login, que se usa para mostrar el formulario de inicio de sesión. La sintaxis para configurar el fichero urls.py para que se muestre el formulario de inicio de sesión es la siguiente:

urlpatterns = [
    path('login/', 'login'),
]

En la sintaxis anterior, login es la URL de la aplicación y login es la vista que se muestra cuando se accede a esa URL.

Si la vista que queremos asignar está implementada como una clase, debemos usar la siguiente nomenclatura:

urlpatterns = [
    path('URL/', 'vista'.as_view()),
]

Si quieres organizar tus urls de forma correcta, cada app dentro de tu proyecto ha de tener su fichero urls.py en su estructura. Además, en el fichero de urls base del proyecto, debes incluir las urls de cada app:

urlpatterns = [
    path('', include('app1.urls')),
    path('', include('app2.urls')),
    path('', include('app3.urls')),
    path('URL/', 'vista'.as_view()),
]

Por último, hay un tercer parámetro opcional para asignarle un nombre a la relación vista-url. De esta manera podremos referirnos a ella desde otras partes de nuestro código.

urlpatterns = [
    path('URL/', 'vista'.as_view()), name="nombreVista",
]

Con esta info ya tienes los conocimientos básicos para poder mostrar una url asociada a una vista. Pero si quieres tener conocimientos más avanzados, como usar patrones de urls, sigue leyendo el siguiente apartado.

Patrones para URLs

Uno de los puntos positivos que tiene Django, es que puedes hacer una página web de forma sencilla, pero es muy flexible si quieres hacer cosas más complejas.

Los patrones para crear URLs son un claro ejemplo de ello, ya que no son necesarios, pero si los usas en un contexto que lo requiera, se trata de una herramienta muy potente.

En términos sencillos, para usar patrones en las URLs, debemos especificar el tipo de dato que vamos a utilizar en la url, así como asignarle un nombre.

Por ejemplo, supongamos que estamos con el ejemplo que canciones que llevamos utilizando a lo largo de todo el curso de Django. En este caso, queremos organizar una web basándonos en la información que tenemos en la base de datos de canciones. Para ello, vamos a hacer una arquitectura web tal que así:

configuracion de urls en django

En la imagen puedes ver la estructura que vamos a implementar: la raíz es el dominio de nuestra web, en la primera subcarpeta tendremos el género, donde mostraremos TODAS las canciones pertenecientes a ese género; por último, la url donde se muestre la información concreta de una canción será: dominio/genero/cancion.

Para implementar esto, primero debemos tener en cuenta la estructura de URLs, que será:

  • dominio/ ▶︎ donde tendremos una landing page que, por ejemplo, liste los géneros de música de nuestra base de datos
  • dominio/genero ▶︎ Se podrá llegar hasta aquí pulsando en uno de los géneros disponibles o escribiéndolo en la url. Se muestran TODAS las canciones que pertenezcan al género.
  • dominio/genero/cancion ▶︎ Pulsando en una de las canciones se llega a esta página, donde se muestra toda la información que tenemos en la base de datos sobre dicha canción.

Para que esta estructura funcione en Django, debemos añadir las siguientes líneas a la variable urlpatterns:

urlpatterns = [
    path('<str:genero>', GeneroView.as_view(), name='genero'),
    path('<path:genero>/<str:cancion>', CancionView.as_view(), name='cancion'),
]

Para que esto funcione, debemos asignar en alguna parte de nuestro código la url, con los parámetros que se especifican en su declaración. Para que esto sea dinámico, es habitual hacerlo directamente desde el template html.

Para ello, debemos asignar la información correspondiente al contexto. Por ejemplo, si estamos en la página principal, asignada a la vista GeneroViews, se deben mostrar los géneros. Así que lo que haremos será crear una variable que almacene todos los géneros de canciones y guardarla dentro de la variable contexto y mandarla al template. Una vez dentro del template:

<div>
    {% for g in generos %}
        <a href="{% url 'genero' genero=gh|slugify %}">
            <p> {{g}}</p>
        </a>
    </div>
    {% endfor %}
</div>

Por otro lado, una vez estamos dentro de un género concreto, haremos algo parecido con las canciones de cada género. Para ello, desde la vista CancionView será necesario almacenar las canciones del género actual y empaquetarlas para enviarlas al template. Entonces, podremos mostrarlas con el siguiente código:

<div>
    {% for c in canciones %}
        <a href="{% url 'cancion' genero=request.path|slugify cancion=c|slugify %}">
            <p> {{c}}</p>
        </a>
    </div>
    {% endfor %}
</div>

En este caso, estamos especificando la URL actual como el género de la canción, ya que la única subcarpeta que deberíamos tener en la URL.

Y con esto terminamos el tema sobre urls.py en Django y los patrones de URLs. Te recomiendo que le eches un ojo al resto de tipos de datos que puedes utilizar, pero es tan sencillo como cambiar el tipo en la declaración.

Pionera del caos

Ingeniera Informática con Máster en Bioinformática, casi doctora y freelancer. Todo lo que te cuento en este blog son aprendizajes que yo misma he tenido ya sea durante mis estudios o en otros proyectos!

Otras Entradas Relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *



Para continuar es necesario que confirmes la política de privacidad de la web.

Subir