Saltar a contenido

Configurar una vista

Una vista es una función o un método que básicamente hace dos cosas, toma como argumento un objeto HttpRequest, en el que va la información referente a la solicitud que estamos haciendo, como por ejemplo si el método empleado es POST o GET.

Para ver como gestiona Django las vistas, las relaciona con el modelo de datos y envía esa información al navegador vamos a empezar creando una vista sencilla, simplemente vamos a mostrar un mensaje por pantalla:

views.py
from django.http import HttpRequest, HttpResponse

def first_view(request: HttpRequest) -> HttpResponse:
    return HttpResponse("Hello World!")
 .
├──  db.sqlite3
├──  manage.py
├──  myapp
│   ├──  __init__.py
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│   │   └──  __init__.py
│   ├──  models.py
│   ├──  tests.py
│   └──  views.py
└──  mysite

Ahora tenemos que asociar la vista que acabamos de definir con una dirección, para hacerlo vamos a manejar dos archivos, uno lo crea Django al iniciar el proyecto y está en mysite/urls.py, el otro lo tendremos que crear nosotros dentro del directorio de nuestra aplicación myapp/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls'))
]
from django.urls import path
from . import views

urlpatterns = [
    path('', views.first_view, name='first-view'),
]
 .
├──  db.sqlite3
├──  manage.py
├──  myapp
│   ├──  __init__.py
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│      └──  __init__.py
│   ├──  models.py
│   ├──  tests.py
   ├──  urls.py # (1)
   └──  views.py
└──  mysite
  1. Este archivo lo creamos manualmente

Respuesta personaliza con HttpResponse

Info

A diferencia de los objetos HttpRequest que Django crea automáticamente, los objetos HttpResponse son nuestra responsabilidad.

Sigamos y definamos otra vista que brinde información sobre la petición realizada:

views.py
def info_request(request: HttpRequest) -> HttpResponse:
    response = f"""
    Método de la solicitud: {request.method}<br />
    Esquema de la solicitud: {request.scheme}<br />
    Codificación de la solicitud: {request.encoding}<br />
    MIME de la solicitud: {request.content_type}<br />
    Tipo de navegador: {request.headers["User-Agent"]}
    """
    return HttpResponse(response) 
 .
├──  db.sqlite3
├──  manage.py
├──  myapp
│   ├──  __init__.py
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│   │   └──  __init__.py
│   ├──  models.py
│   ├──  tests.py
│   └──  views.py
└──  mysite

Ahora tenemos que incluir esta vista en el urlpatterns:

urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.first_view, name='first-view'),
    path('info/', views.info_request, name='info-request')
]
 .
├──  db.sqlite3
├──  manage.py
├──  myapp
│   ├──  __init__.py
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│   │   └──  __init__.py
│   ├──  models.py
│   ├──  tests.py
│   ├──  urls.py
│   └──  views.py
└──  mysite

Cargar una plantilla (template)

La función render() toma el objeto de la solicitud (request) como primer argumento, un nombre de plantilla como segundo argumento y un diccionario como tercer argumento opcional.

Definir una función que retorna un template

views.py
from django.shortcuts import render

def first_template(request: HttpRequest) -> HttpResponse:
    return render(request, 'index.html')
bash
mkdir -p myapp/templates
touch myapp/templates/index.html
 .
├──  myapp
│   └──   templates
│        └──  index.html
└──  mysite

Escribimos algo en la plantilla:

<h1>Hello World!</h1>
<h2>From template 'index.html'!</h2>
 .
├──  db.sqlite3
├──  manage.py
├──  myapp
│   ├──  __init__.py
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│      └──  __init__.py
│   ├──  models.py
│   ├──  templates
      └──  index.html
   ├──  tests.py
│   ├──  urls.py
│   └──  views.py
└──  mysite