Django

Vistas en Django

Una vista en una función o una clase en python que recibe una petición de la web a través de una URL y devuelve una respuesta ya sea un documento HTML, una redirección, un error o cualquier dato. La vista contiene toda la lógica necesaria para devolver una respuesta. Las vistas se encuentran definidas por defecto en el archivo views.py.

Ejemplo de vista basada en funciones:

from django.http import HttpResponse
def mi_vista(request):
return HttpResponse('Respuesta')

Para enlazar la vista con la URL a la que responde sería algo como esto:

from django,conf,urls import patterns, url
urlpatterns = patterns('',
url(r'^$', 'apps.principal.views.mi_vista'),
)

Shorcuts:
Django cuenta con facilidades para enviar otro tipo de respuestas

Render – Para enviar como respuesta una plantilla, recibe 2 parámetros obligatorios, la petición y la plantilla a renderizar.

from django.shorcuts import render
def mi_vista(request):
return render(request,'mi_plantilla.html',{'nombre':'Pepe'})

En el ejemplo vemos como le pasamos como tercer parámetro un diccionario, donde le damos valores a variables que queremos renderizar en la plantilla para hacer que los datos varien.

Redirect – Envía una redirección a otra URL.

Vistas basadas en clases:
Las vistas basadas en clases utilizan objetos de python en lgar de funciones como vimos anteriormente. Django permite definir una clase para utilizarla como una vista, permitiendo una mejor estructura a las vistas y reutilizar código gracias a la herencia y los mixins.
Con Django ya vienen incorporadas algunas vistas genéricas pensadas para realizar tareas simples.
Es importante destacar que para llamar a una vista basada en clases desde la URL debemos llamar al método as_view()

from django.conf.urls import patterns, url
from . views import IndexView
urlpatterns = patterns('',
url(r'^$',IndexView.as_view())
)

Para comenzar con las vistas genéricas incorporadas en django tomemos las vistas bases:

Base Views:

  • View
  • TemplateView
  • RedirectView

De estas vistas se desprende el resto de las vistas genéricas.

  • View: Es la vista maestra de la que todas heredan.
  • TemplateView: Es una vista para renderizar una plantilla. Solamente debemos proporcionarle la plantilla que debe renderizar mediante el parámetro template_name y esta vista se encarga del resto.
    En ocasiones, puede que queramos enviar información a la plantilla para que se muestre de forma dinámica, aquí entra en juego el método get_context_data(), por ejemplo:
from django.shortcuts import render
from django.view.generic import TemplateView
class IndexView(TemplateView):
template_name = 'index.html'

def get_context_data(self, **kwargs):
    context = super(IndexView,self).get_context_data(*kwargs*) #Capturamos el contexto del padre.
    context['nombre'] = "Pepe" #Le agregamos la información necesaria.
    return context #Retornamos el contexto.
  • RedirectView: Es una vista dedicada a redireccionar a otra URL. A esta vista solo debemos pasarle la URL a la que debe redireccionar mediante el atributo url si especificamos la ruta directamente o mediante pattern_name si especificamos el nombre de la ruta en el archivo urls.py.

De esta manera terminamos con las base views y pasamos a otro tipo de vistas genéricas:

Generic Display Views: Son vistas genéricas utilizadas para mostrar información. Dentro de este grupo tenemos a:

  • DetailView: Permite obtener un solo objeto del modelo de acuerdo a lo que le pasamos por parámetro en la URL. Como atributo debemos indicarle el modelo sobre el cual trabajar mediante model, y la plantilla a renderizar mediante template_name. Por defecto los datos obtenidos del modelo se envían a la plantilla en una variable llamada object, esto es posible modificarlo mediante el atributo context_object_name. Es importante que sepamos que por defecto solo funciona con atributos del modelo pk y slug. Para cambiar este comportamiento por defecto debemos utilizar el atributo slug_field pasandole el atributo por el que buscar en el modelo.

Ejemplo:

from django.shortcuts import render
from django.views.generic import DetailView
from .models import Usuario
class IndexView(DetailView):
model = Usuario
template_name = 'index.html'
slug_field = 'username'
context_object_name = 'usuario'

De esta manera, teniendo una ruta como:

from django.conf.urls import patterns, url
from .views import IndexView

urlpatterns = patterns('',
url(r'ûsuario/(?P[-\w]+)/$', IndexView.as_view()),
)

Al llamar a la URL
http://localhost:8000/usuario/pcruz
DetailView se encarfa de buscar en el modelo Usuario el que tenga como atributo username pcruz y enviar todos sus datos al modelo a través de la variable usuario.

  • ListView: Es la vista que nos permite obtener una lista de objetos de un modelo. Su funcionamiento es similar al ejemplo anterior y se pueden utilizar los mismos atributos, con la particularidad de que devuelve una lista de objetos basados en un filtro que se especifica mediante el atributo queryset.

Ejemplo:

from django.shortcuts import render
from django.views.generic import ListView
from .models import Usuario
class IndexView(ListView):
model = Usuario
template_name = 'index.html'
context_object_name = 'usuarios'
queryset = Usuario.objects.filter(age__lt = 18)

Con este queryset especificamos que solo muestre los usuarios menores de 18 años, podemos discriminar de esta manera los datos a mostrar filtrando sobre cualquiera de los atributos del modelo.

  • FormView: Es una vista que muestra un formulario donde en caso de error muestra los errores de validación y en caso de éxito redirije a una URL. Esta clase tiene atributos importantes como form_class donde se define que formulario es el que debe mostrar. El atributo success_url define a que URL redirecciona en caso de éxito. Como las clases anteriores espera tambien una plantilla a donde enviará el formulario en la variable form. Esta plantilla se define en el atributo template_name.
  • CreateView: Es una vista que muestra un formulario para crear un objeto. Su funcionamiento es muy similar al anterior con la peculiaridad de que automáticamente guarda el objeto. Podemos pasarle un atributo form_class para indicarle el formulario o podemos pasarle el modelo mediante el atributo model y automáticamente tomará todos los campos de dicho modelo.
  • UpdateView: Es una vista que muestra un formulario para la edición de un objeto existente. El funcionamiento es similar al anterior con la peculiaridad que automáticamente rellena los campos del objeto solicitado por la URL y da opción para modificarlo.

*DeleteView: Es una vista que muestra una página de confirmación y elimina un objeto existente.

Hasta aquí las vistas genéricas incluídas en django.

Para terminar el artículo queremos remarcar que una de las diferencias notables en el uso de las vistas basadas en clases sobre las vistas basadas en funciones es la respuesta a los distintos tipos de peticiones http. Mientras en las vistas basadas en funciones debemos hacer varios codicionales preguntando que tipo de petición es para ejecutar un conjunto de acciones u otras, en las vistas basadas en clases basta con definir el método con el nombre del tipo de petición y su implementación base decide mediante el método dispatch() que método debe responder. Suena más complicado de lo que es realmente, lo ilustramos a continuación con un ejemplo:

Vistas basadas en funciones:

def index(request):
if(request.method == 'get'):
#conjunto de instrucciones para get
if(request.method == 'post'):
#conjunto de instrucciones para post

Vistas basadas en clases:

from django.views.generic import View
class IndexView(View):
def get(self, request, *args, **kwargs):
    #conjunto de instrucciones para get

def post(self, request, *args, **kwargs):
    #conjunto de instrucciones para post

De esta forma lo separamos en métodos y resulta un código mucho más limpio.

Hasta aquí el artículo de hoy, no olvides dejar tu comentario.
Saludos y hasta la próxima.

Un comentario

  • Alexx

    Hermano, estoy también un poco metido en el mundo de Django. Veo que las informaciones que estas poniendo no son para Django 2 en adelante, ya para estas versiones cambian muchas cosas. Me interesaría me ayudaras a buscar un curso bastante completo en video, si lo tuvieras y me lo pudieras enviar poco a poco por correo te lo agradecería, si no dame un link. No te vayas a asustar, es que aunque trabajo en Etecsa estoy sin Internet Saludos.

Responder a Alexx Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *