- Dos formas de crear vistas en Django
- Vistas basadas en funciones (function-based views)
- Vistas basadas en clases (class-based views)
- Usando vistas genéricas con clases
En esta lección, vamos a explorar las vistas en Django: qué son, para qué sirven y cómo crearlas de dos maneras: con funciones o con clases. No te preocupes si es nuevo para ti, lo explicaremos paso a paso.
¿Qué son las vistas en Django?
request) que llega al servidor y devolver una respuesta (response).
Piénsalo así: cuando alguien entra a una dirección web (como /login o /inicio), Django necesita saber qué debe mostrar (una página, un JSON, un mensaje de error…). Ahí es donde entra la vista.
Sin importar si tu app usa base de datos o plantillas (templates), siempre va a necesitar vistas para responder al navegador del usuario.
Dos formas de crear vistas en Django
| Tipo de vista | Cómo se crea | Ideal para... |
|---|---|---|
| Vista basada en función | Usando funciones normales de Python | Casos simples o cuando quieres control total |
| Vista basada en clase | Usando clases que heredan de View | Reutilizar código, proyectos más grandes |
Una misma aplicación puede tener vistas de ambos tipos. No hay una mejor que otra en todo sentido; todo depende del caso.
Vistas basadas en funciones (function-based views)
Estas vistas son simples funciones de Python que reciben un objeto request (la solicitud) y devuelven un objeto response (la respuesta).
Veamos un ejemplo básico:
from django.shortcuts import render
def login(request):
if request.method == 'GET':
return render(request, 'login_page.html', {
'username': request.GET.get('username', '') # valor por defecto si no viene username
})
elif request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# Aquí normalmente validarías los datos...
return render(request, 'welcome.html', {'user': username})
Qué aprendemos con este ejemplo?
request.methodnos dice si el navegador hizo una solicitud GET o POST.request.GETyrequest.POSTnos permiten acceder a los datos que vienen con esa solicitud (por ejemplo, un formulario que el usuario llenó).renderes una función que crea una respuesta HTML a partir de un template y unos datos.
Decoradores útiles para vistas con funciones
Django tiene algunos decoradores que facilitan el trabajo. Un decorador es como una función que modifica el comportamiento de otra.
Por ejemplo, si quieres aceptar solo solicitudes GET y POST, puedes usar:
from django.views.decorators.http import require_http_methods
@require_http_methods(['GET', 'POST'])
def login(request):
...
Si alguien intenta hacer un DELETE, este decorador devolverá automáticamente una respuesta con error 405, Method Not Allowed.
Vistas basadas en clases (class-based views)
Django también permite crear vistas como clases. Esto ayuda a manejar estructuras más complejas de forma ordenada y reutilizable.
Aquí un ejemplo muy sencillo:
from django.http import HttpResponse
from django.views import View
class IndexView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hola mundo')
¿Qué vemos aquí?
- Creamos una clase que hereda de
django.views.View. - Definimos un método
getpara decir qué pasa cuando llega una solicitud GET. - Cada solicitud crea una nueva instancia de esta clase (por eso podemos guardar estado si queremos).
La registramos en las urls así:
from django.urls import path
from .views import IndexView
urlpatterns = [
path('', IndexView.as_view()), # Note el uso de .as_view()
]
El método as_view convierte la clase en una función entendible por Django.
Usando vistas genéricas con clases
Django nos da clases ya listas para tareas comunes. Una de esas es TemplateView, ideal para mostrar un template sin necesidad de escribir mucho código.
Ejemplo:
from django.views.generic.base import TemplateView
urlpatterns = [
path('', TemplateView.as_view(template_name='index.html')),
]
Eso es todo. No necesitas ni siquiera crear la clase tú mismo si solo quieres mostrar ese template.
Pero ¿y si necesitas pasarle datos al template? Ahí sí defines tu propia clase:
class HomePageView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['who'] = 'Mundo'
return context
Ventajas de usar vistas basadas en clases
- Puedes heredar y reutilizar código.
- Django ya ofrece muchas herramientas listas.
- Perfectas para trabajar con bases de datos (mostrar listas, detalles, formularios, etc.).
Resumen
- Las vistas son la forma en que una app Django responde a solicitudes.
- Hay dos tipos de vistas: funciones y clases.
- Las vistas por función son más directas y dan control total.
- Las vistas por clase permiten organizar mejor el código y reutilizar funcionalidades fácilmente.
- Django ya tiene clases genéricas listas para ayudarte con tareas comunes.
- Puedes elegir el tipo que mejor se ajuste a tu necesidad, incluso combinarlos en un mismo proyecto.
Trabajo independiente
Reescribe tus vistas como clases
En esta actividad vas a trabajar con vistas basadas en clases en Django. Sigue estos pasos:
- Reescribe
codica_django_blog.views.indexusandoTemplateView. La vista debe heredar de esta clase directamente, no ser reemplazada porTemplateView.as_view(...). - Reescribe
codica_django_blog.article.views.indexcomo una clase hija deView. Más adelante vamos a expandir esta clase, así que mantenla preparada para modificaciones futuras.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.