Contenidos

¿Qué son las views o vistas?

Hasta ahora sólo hemos utilizado interfaces gráficas que trae Django, sin embargo, a nuestra aplicación web le hace falta mostrar páginas para poder interactuar.

Django utiliza la arquitectura MTV (Model Template View); similar a MVC (Model View Controller) donde Model tiene que ver con la base de datos, View con la parte visual de la aplicación, y Controller con la parte lógica.

La diferencia entre MVC y MTV es que las Views en Django no son la parte visual de la aplicación, más bien la parte lógica o el Backend que se corresponde a una página web, mientras que Templates sí son la parte visual o el Frontend. Las vistas pueden ser funciones, conocidas como Function Based Views; o clases, conocidas como Generic Views.

Podemos decir que con Django, tenemos Model que mostramos por medio de Template, y esta funciona a partir de un View.

Las Views, en código, puede funciones (Function Based Views) o clases (Generic Views)

Aportes de la comunidad

Creando vistas para la aplicación

Las vistas, como podíamos haber pensado, se definen en el archivo views.py de la aplicación, y este archivo ya lo habíamos modificado, cuando creamos una vista para mostrar un Hello World a través de una función index, ahora sabemos que esto es una function based view.

Las vistas siempre reciben un objeto de tipo http request como parámetro, son las peticiones del cliente (o usuario) que ingresa a una página web, de esta forma el backend resuelve la petición respondiendo con la respuesta http que le corresponde.

Hagamos algunas vistas de ejemplo para nuestra aplicación:


# Archivo premiosPlatzi/polls/views.py
from django.shortcuts import render
from django.http import HttpResponse

# Es buena práctica que la vista principal se llame index
def index(request):
    return HttpResponse('Estás en la página principal de Premios Platzi App')

def detail(request, question_id):
    return HttpResponse(f'Estás viendo la pregunta número {question_id}')

def results(request, question_id):
    return HttpResponse(f'Estás viendo los resultados de la pregunta número {question_id}')

def vote(request, question_id):
    return HttpResponse(f'Estás votando en la pregunta número {question_id}')

Por ahora las vistas no están haciendo mayor cosa, simplemente estamos respondiendo con un mensaje para ver cómo funcionan, luego desarrollaremos la lógica que les corresponde. Para hacer que estas vistas sean visibles en la aplicación, tenemos que añadirlas a las rutas, en el archivo urls.py de la aplicación (polls):

# Archivo premiosPlatzi/polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
    #ex: /polls/5/
    path('<int:question_id>/', views.detail, name='detail'),
    path('results/<int:question_id>/', views.results, name='results'),
    path('vote/<int:question_id>/', views.vote, name='vote'),
]

El operador <> indica un dato variable, y será pasado como argumento a la función de vista que se haya asignado a su url. Por ejemplo, si hacemos una petición a /results/5, Django llamará a la función de vista pasándole 5 como argumento de question_id, algo así views.results(question_id=5)

Templates de Django