Vistas

Las vistas en Django constituyen la pieza de software que lleva a cabo la «lógica de negocio» relacionando urls, modelos y plantillas.

Una vista es simplemente una función que siempre recibe como primer parámetro la petición «http» y como resto de parámetros los indicados en la url correspondiente.

Creando vistas

Cuando creamos una nueva aplicación en nuestro proyecto Django se nos crea un fichero views.py dentro de dicha aplicación que es donde tenemos que escribir nuestras vistas.

Vista de lista

Vamos a implementar nuestra primera vista que sería aquella que permite listar todas las canciones de nuestro proyecto:

tracks/views.py
1from django.http import HttpRequest, HttpResponse
2from django.shortcuts import render
3
4from .models import Track
5
6
7def track_list(request: HttpRequest) -> HttpResponse:
8    tracks = Track.objects.all()
9    return render(request, 'tracks/track/list.html', dict(tracks=tracks))

Analicemos cada línea por separado:

  • L1 → Estos «imports» no son necesarios. Se han incluido en el código a modo de aclaración para que las anotaciones de tipo expliquen por sí mismas los parámetros de la función.

  • L2 → Django proporciona una serie de atajos [1]. En este caso importamos la función render()

  • L4 → Las vistas suelen manejar modelos. En este caso estamos importando el modelo Track de la propia aplicación tracks.

  • L7 → El único parámetro request es la petición HttpRequest. La función debe devolver una respuesta HttpResponse

  • L8 → Obtenemos todas las canciones.

  • L9 → Utilizamos la función render(). Esta función recibe como primer parámetro la ruta al fichero de plantilla y en segundo lugar un diccionario con el contexto (variables). Renderiza la plantilla y devuelve la respuesta «http».

Vista de detalle

La siguiente vista que vamos a escribir es aquella que se encarga de mostrar el detalle de una determinada canción. En esta vista recibimos un parámetro que viene en la url y que nos indica la clave primaria de la canción en cuestión:

tracks/views.py
10# previous code...
11
12def track_detail(request: HttpRequest, pk: int) -> HttpResponse:
13    track = Track.objects.get(pk=pk)
14    return render(request, 'tracks/track/detail.html', dict(track=track))

Analicemos cada línea por separado:

  • L12 → La función no sólo recibe la petición «http» sino la clave primaria de la canción pk que queremos manejar. Es de tipo entero porque hemos aplicado un conversor de ruta en la url.

  • L13 → Obtenemos la canción concreta que nos interesa.

  • L14 → Utilizamos la función render() pasando en el contexto la canción que hemos obtenido previamente.