Introducción a las vistas

Completado

En programación, una vista suele ser un componente que muestra información al usuario. Las tareas que realiza una vista pueden variar en función del marco de trabajo y de las convenciones, incluida la responsabilidad de cargar los datos.

En Django, una vista normalmente se encarga de lo siguiente:

  • Validar la solicitud de un usuario.
  • Cargar o modificar los datos adecuados.
  • Devolver una plantilla HTML con la información al usuario.

Vamos a comenzar la exploración analizando la creación manual de vistas y configurando el URLconfs adecuado. Un URLconf es una lista de rutas de acceso que indican el patrón que debe coincidir, la función a la que se debe llamar y, opcionalmente, un nombre. En una unidad posterior, veremos cómo Django puede controlar automáticamente parte del código que hemos escrito manualmente.

Creación de una vista

Para crear una vista desde cero en Django, normalmente se crea una función. Normalmente, la función contiene el código adecuado para realizar lo siguiente:

  • Realizar la tarea que el usuario ha solicitado.
  • Devolver una plantilla con los datos adecuados que se van a mostrar al usuario.

Las funciones de vista siempre toman al menos un parámetro denominado request, que representa la solicitud del usuario. Puede proporcionar más parámetros según sea necesario si espera más información del usuario en la dirección URL, como el nombre o el id. de un elemento. Los registrará al crear la ruta, de la que hablaremos más adelante en la unidad.

Carga de datos

Puede usar el ORM de Django para cargar los datos que necesita de la base de datos registrada.

El proyecto que estamos creando tiene dos modelos, Shelter y Dog. Podemos cargar todos los objetos o realizar otras consultas mediante los modelos que hemos creado. Para cargar todos los refugios, por ejemplo, usaríamos Shelter.objects.all(). Podemos cargar un refugio individual mediante Shelter.objects.get(pk=1).

Nota:

pk es un método abreviado de teclado para la clave principal. Puede usar id y obtener el mismo resultado, pero, si usa pk, se asegurará de que el comando funcione si ha cambiado el nombre de la propiedad que representa la clave principal.

Errores 404

Un error 404 en las aplicaciones web significa "no encontrado". Como procedimiento recomendado, debe devolver un 404 cada vez que se realiza una solicitud para un objeto que no existe.

Django proporciona métodos abreviados de teclado para intentar cargar datos:

  • get_object_or_404 y get_list_or_404: carga un objeto por una clave principal o devuelve un 404 al usuario si un objeto no se encuentra.
  • get_list_or_404: realiza la misma operación que el otro método abreviado de teclado, excepto por el hecho de que acepta un parámetro de filtro.

En nuestro ejercicio, usaremos get_object_or_404.

Representación de la plantilla

El motor de plantillas de Django tomará la plantilla HTML que creemos, la combinará con los datos que proporcionemos y emitirá el código HTML para el explorador. La función auxiliar para realizar esta tarea es render.

La función render necesita el objeto que representa la solicitud, que es el parámetro request que resaltamos anteriormente. También puede pasar el nombre de la plantilla, normalmente un archivo HTML que residirá en una carpeta denominada templates.

Para pasar datos a la plantilla, debe proporcionar a render un objeto de diccionario context. El objeto context contiene un conjunto de pares clave-valor, en los que cada clave se convierte en una variable de la plantilla.

Ejemplo

Para crear una vista para mostrar todos los refugios, puede usar el código siguiente:

def shelter_list(request):
    shelters = Shelter.objects.all()
    context = { 'shelters': shelters }
    return render(request, 'shelter_list.html', context)

Registro de una ruta de acceso

Casi cualquier marco web usa rutas de acceso para procesar las solicitudes de usuario. Las rutas de acceso convierten la parte de la dirección URL que hay después del nombre de dominio y antes de la cadena de consulta (que sigue al signo de interrogación) en una llamada de función.

Una llamada a www.contoso.com/shelters podría llamar a una función para enumerar todos los refugios, mientras que www.contoso.com/shelters/1 podría llamar a una función para mostrar un refugio con un identificador de 1. Para registrar las rutas de acceso en Django, se debe crear un URLconf.

Supongamos que tenemos un módulo denominado views, que es una convención de Django. Se puede enrutar el tráfico de índices en el que no se especifica una ruta de acceso (como www.contoso.com) a una función de views denominada index, y asignarle un nombre index mediante la siguiente ruta de acceso:

path('', views.index, 'index')

También podemos crear carpetas virtuales para solicitudes específicas. Por ejemplo, si quisiéramos enumerar todos los refugios si alguien solicita /shelters, podríamos usar el comando siguiente:

path('shelters', views.shelter_list, 'shelter_list')

Parámetros de dirección URL

Es una práctica común pasar parámetros a una aplicación como parte de la dirección URL, como un identificador o un nombre. Dado que estos valores cambiarán, no queremos codificarlos de forma rígida en nuestra ruta de acceso. En Django, puede especificar un parámetro mediante una sintaxis especial. En esa sintaxis, puede indicar el tipo de datos que espera, como un entero, y un nombre.

Por ejemplo, para crear una ruta de acceso para que alguien solicite un refugio específico mediante un identificador, es necesario tener un parámetro de tipo integer. (La razón es que nuestra clave principal es un entero). Después, podemos proporcionar el nombre que queremos usar para la variable, que se pasará como parámetro a la función de vista. La sintaxis para identificar este parámetro sería <int:pk>. Observe la declaración de tipos, los dos puntos y el nombre de la variable.

La ruta de acceso completa podría tener el aspecto siguiente:

path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')

La función de vista asociada tendría la siguiente firma:

def shelter_detail(request, pk):
    # code

La parte pk de la firma de la ruta de acceso se pasa a shelter_detail como un parámetro, como si la llamáramos como una función de Python normal.