Cuando se trabaja en django resulta claro que hay muchas labores que son mas y mas fáciles, pero manejar la lógica de una petición mediante una función puede ser perjudicial a la hora de manejar muchas vistas. Es por eso que en este post vamos a ver cómo usar class bases views, una forma mas ordenada de encapsular la lógica.
¿Qué son?
Class-Based-Views (CBV en adelante) es una forma alternativa para crear vistas en django, no pretende reemplazar las Function-Based-Views (FBV en adelante) , pero si tienen como objetivo permitir al desarrollador:
- Organización del código relacionado con metodos HTTP específicos (GET, POST, PUT, etc) y que el router pueda acceder a estos sin tener que usar condicionales específicas.
- Técnicas orientadas a objetos (Como los Mixins) para solucionar ciertos problemas.
¿Por qué usarlas?
La pregunta clave es ¿por qué? y ante esto hay varias cosas que la respaldan:
- Orden.
- Estética del Código.
- Reciclaje del Código.
- Uso de herramientas de OOP.
- Simpleza.
- Estructura bien definida (definición de acciones para cada protocolo, definición de respuestas para casos de éxito y falla con métodos como get_success_url).
¿Cómo funcionan?
Para entender mejor ciertos aspectos de cómo funcionan las CBV debemos ver un poco de FBV
# views.py
from django.shortcuts import render
def index(request):
if request.method == 'GET':
# TODO: GET ACTIONS
return render(request,"template_get.html")
elif request.method == 'POST':
# TODO: POST ACTIONS
return render(request,"template_POST.html")
elif request.method == 'PUT':
# TODO: PUT ACTIONS
return render(request,"template_put.html")
elif request.method == 'DELETE':
# TODO: DELETE ACTIONS
return render(request,"template_del.html")
# end views.py
# ----------------------
# urls.py
from django.conf.urls import patterns
urlpatterns = patterns('',
(r'^$', "myapp.views.index"),
)
# end urls.py
Como vemos en el código anterior en una sola función la lógica de múltiples ti pos de respuestas, y esto no es adecuado porque restara mantenibilidad y escalabilidad a nuestra aplicación, para evitar eso están las CBV, veamos a continuación cómo sería esto:
# views.py
from django.views.generic.base import View
from django.shortcuts import render
class IndexView(View):
def get(self, request):
# TODO: GET ACTIONS
return render(request,"template_get.html")
def post(self, request):
# TODO: POST ACTIONS
return render(request,"template_POST.html")
def put(self, request):
# TODO: PUT ACTIONS
return render(request,"template_put.html")
def delete(self, request):
# TODO: DELETE ACTIONS
return render(request,"template_del.html")
# end views.py
# ----------------------
# urls.py
from django.conf.urls import patterns
from myapp.views import IndexView
urlpatterns = patterns('',
(r'^$', IndexView.as_view()),
)
# end urls.py
Como vemos en el código anterior la legibilidad del código mejoraría en caso de que existiesen muchas líneas de código por cada método, además de que ya sería posible usar ciertas técnicas de programación orientada a objetos como los mixins.
Espero que les sea de utilidad.
Si te gusto el post
compartelo... :D