El siguiente artículo es la parte 6 de la serie de exploración de vistas basadas en clases (CBV) de Django, donde abordamos cómo automatizar el renderizado de páginas simples y el manejo de redirecciones mediante TemplateView y RedirectView. Si en el artículo anterior (parte 5) construiste un CRUD usando CreateView, UpdateView y DeleteView, en esta ocasión veremos cómo organizar de manera eficiente páginas más ligeras y manejo de redirecciones.

Haz clic en el siguiente enlace para acceder al artículo anterior!

Implementar CRUD con CreateView, UpdateView y DeleteView


“Automatiza la estructura de páginas simples y redirecciones fácilmente con Django TemplateView y RedirectView!”


1. TemplateView & RedirectView, ¿por qué son necesarios?

TemplateView y RedirectView son vistas basadas en clases especializadas en los casos de uso más simples en Django.

  1. TemplateView

    • Es útil cuando deseas pasar una página estática o un contexto simple a la plantilla sin lógica de procesamiento de datos adicional.

    • Ej) Página “Acerca de”, página “FAQ”, páginas de error como 404/500 (si se configuró por separado).

  2. RedirectView

    • Se utiliza para redirigir inmediatamente a una URL específica.

    • Ej) Redirigir a una página específica al acceder a la raíz del dominio (/), servicio sencillo de URL corta, redirección para promover campañas, etc.

Ambos se centran en el manejo de páginas simples que no requieren manipulación de bases de datos o validación de formularios, lo que los distingue de las vistas mencionadas anteriormente como FormView y CreateView.


2. Uso de TemplateView

Flujo de TemplateView - Renderizado automático de HTML

2.1 Estructura básica

# views.py
from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'
  • template_name: Especifica la ruta del archivo de plantilla que se renderizará.

  • No es necesario sobrescribir el método get(); por defecto, al recibir una solicitud GET, se renderizará la plantilla especificada en template_name.

2.2 Conexión en urls.py

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

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]
  • Se mostrará la plantilla home.html al acceder a la URL raíz ("").

2.3 Ejemplo de plantilla: home.html

<!DOCTYPE html>
<html>
<head>
  <title>Página Principal</title>
</head>
<body>
  <h1>¡Hola! Esta es la página principal.</h1>
</body>
</html>

3. Pasando datos de contexto en TemplateView

RedirectView - una redirección inteligente que gira automáticamente

Además del simple renderizado de plantillas, cuando deseas pasar variables simples a la plantilla, sobrescribes el método get_context_data().

from django.views.generic import TemplateView

class AboutPageView(TemplateView):
    template_name = 'about.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['page_title'] = 'Acerca de Nosotros'
        context['description'] = 'Este sitio es un ejemplo para presentar Django CBV.'
        return context

Entonces puedes usar las variables page_title y description en la plantilla:

<!-- about.html -->
<!DOCTYPE html>
<html>
<head>
  <title>{{ page_title }}</title>
</head>
<body>
  <h1>{{ page_title }}</h1>
  <p>{{ description }}</p>
</body>
</html>

Consejo:

  • TemplateView es especialmente útil para crear páginas simples que no requieren consultas a la base de datos,

  • Además, si necesitas variables comunes en varias plantillas, considera combinarlas con Mixin o una plantilla base.


4. Uso de RedirectView

4.1 Estructura básica

# views.py
from django.views.generic import RedirectView

class BlogRedirectView(RedirectView):
    pattern_name = 'blog_list'  # Nombre de la URL

    # (Opcional) Puedes especificar parámetros necesarios al hacer reverse de la URL
    # query_string = True        # Mantener query string
    # permanent = False         # Redirección permanente o no (301 vs 302)
  • pattern_name: Al especificar el nombre de la URL (por ejemplo, 'blog_list') de urls.py, se redirigirá a esa ruta al ejecutar la vista.

  • Si estableces permanent=True, hará una redirección permanente (301); si se deja como valor por defecto (False), será una redirección temporal (302).

  • Si estableces query_string=True, también añadirá la cadena de consulta de la URL existente (?page=2, etc.) en la URL de redirección.

4.2 Conexión en urls.py

# urls.py
from django.urls import path
from .views import BlogRedirectView, HomePageView

urlpatterns = [
    path('go-to-blog/', BlogRedirectView.as_view(), name='go_to_blog'),
    path('', HomePageView.as_view(), name='home'),
]
  • Al acceder a /go-to-blog/, se redirigirá a la URL patrón especificada como 'blog_list'.

4.3 Especificar URL directamente

No solo puedes usar el nombre de URL, sino que también puedes introducir rutas absolutas o enlaces externos directamente en la propiedad url.

class ExternalRedirectView(RedirectView):
    url = 'https://www.djangoproject.com/'

urlpatterns = [
    path('django-home/', ExternalRedirectView.as_view(), name='django_home'),
]
  • Esto redirigirá de /django-home/ a https://www.djangoproject.com/.

5. Ejemplos de TemplateView & RedirectView

  1. Página de anuncios: Puedes utilizar TemplateView para mostrar una página estática con contenido fijo de anuncios sin conectarte a la base de datos.

  2. Página de FAQ / ‘Próximamente’: También es útil para mostrar rápidamente FAQs de productos o páginas de mantenimiento temporal.

  3. Redirección de la raíz del dominio: Puedes automatizar lógicas de redirección simples como “redirigir a /home/ al acceder a la página principal” con RedirectView.

  4. Conexión a enlaces de servicios externos: Igualmente útil como URLs cortas, cuando rediriges a sitios externos al visitar una ruta específica.


6. Comparación con FBV

Función FBV (vista basada en funciones) TemplateView / RedirectView (vista basada en clases)
Renderizado de páginas estáticas (ej: FAQ) def faq(request): return render(request, 'faq.html') y así sucesivamente TemplateView: solo necesitas especificar template_name para un renderizado automático
Redirección simple return redirect('some_url') / HttpResponseRedirect(...) usados RedirectView: solo con especificar una URL o pattern_name es suficiente
Transmisión de contexto adicional Cada vez context = {...} -> render(...) se maneja de forma directa Mediante get_context_data() puedes gestionar de manera estructural y coherente
Estructura de código / Mantenimiento Para páginas cortas o redirecciones simples, FBV funciona correctamente, pero aparece redundancia si hay muchas páginas estáticas o redirecciones. “Las configuraciones necesarias están separadas como propiedades o métodos”, lo que facilita el mantenimiento.
Productividad en desarrollo (palabras clave clave) “Usar funciones de renderizado, redirección -> posibilidad de redundancia” “Ahorro de tiempo, coherencia en el código y facilidad de mantenimiento”

7. Conclusiones y adelanto del siguiente artículo

TemplateView y RedirectView son vistas basadas en clases que ayudan a gestionar el manejo más simple de páginas en proyectos de Django.
Cuando no se necesita lógica compleja como la interacción con la base de datos o la validación de formularios, su uso puede reducir el código duplicado y mantener la estructura del proyecto más limpia.

¡Ahora podemos implementar la mayoría de los elementos esenciales del desarrollo web usando CBV, como “páginas estáticas”, “redirecciones”, “CRUD (crear/editar/eliminar)”, “listados/detalles” y “manejo de formularios”!

En el siguiente artículo (parte 7 de la serie), planeo presentar cómo reutilizar fácilmente funciones comunes en Django utilizando Mixin, así como implementar de manera eficiente la gestión de permisos y la verificación de inicio de sesión.


Revisar el artículo anterior

  1. Clase basada en vistas (CBV) serie de exploración #1 - Razón para pasar de FBV a CBV y la mentalidad del desarrollador
  2. Clase basada en vistas (CBV) serie de exploración #2 - Entendiendo la clase de vista básica de Django
  3. Clase basada en vistas (CBV) serie de exploración #3 - Manejo fácil de formularios con FormView
  4. Clase basada en vistas (CBV) serie de exploración #4 - Uso de ListView & DetailView
  5. Clase basada en vistas (CBV) serie de exploración #5 - Implementando CRUD con CreateView, UpdateView y DeleteView

“Automatiza el manejo incómodo de páginas estáticas y redirecciones con TemplateView y RedirectView,
¡y haz que tu proyecto sea más conciso y productivo!”