Thumbnail: django

La Biblioteca, aplicación en Django 1.8 | Parte V

por , en la categoría de Django
7 minuto(s) de lectura
Este artículo hace parte de la serie «Django dummies»:
  1. La Biblioteca, aplicación en Django 1.8 | Parte I
  2. La Biblioteca, aplicación en Django 1.8 | Parte II
  3. La Biblioteca, aplicación en Django 1.8 | Parte III
  4. La Biblioteca, aplicación en Django 1.8 | Parte IV
  5. La Biblioteca, aplicación en Django 1.8 | Parte V
  6. La Biblioteca, aplicación en Django 1.8 | Parte VI
  7. La Biblioteca, aplicación en Django 1.8 | Parte VII

Introducción

Hemos llegado a la parte V de esta serie de posts donde estamos construyendo una aplicación desde cero usando Django 1.8, en la entrada anterior hablamos un poco acerca de la arquitectura que maneja el framework, y definimos dos de sus componentes principales: Las Vistas y los Templates; aunque también hablamos de las urls y el papel que juegan en cualquier aplicación Django. Espero que la teoría haya quedado clara, sino puedes volver a leer el post anterior. Hoy vamos a realizar algo mas practico, crear templates, y las vamos a integrar con lo que llevamos hasta ahora.

Empezemos

Abre la carpeta de la aplicación (ya sabes sitiolectura/biblioteca), y dentro crea una carpeta con en el nombre que desees, yo le pondré templates, una vez creada ese carpeta, debes de crear otra cuyo nombre debe de ser igual al nombre de la aplicación, en mi caso biblioteca. Al final debe de quedarte algo como sitiolectura/biblioteca/templates/biblioteca, es en esta última carpeta donde crearemos todas nuestras templates. En una imagen lo podemos ver mejor:

arbol

Crea entonces una nuevo archivo y ponle por nombre allbooks.html y coloca lo siguiente:


{{ object_list }}

Vamos a biblioteca/views.py, y creamos una nueva vista:

def books(request):
	# Esta vista se encarga de hacer las gestiones para mostrar todos los libros de la BD en allbooks.html

	all_books = Libro.objects.all() #traemos todos los libros
	context = {'object_list':all_books}
	return render(request, 'biblioteca/allbooks.html', context) #retornamos un HttpResponse

Cosas por decir hasta acá:

  • Hemos creado una función vista llamada books
  • all_books es una variable que almacena todos los libros de la base de datos, estamos haciendo uso de la api para modelos proporcionados por Django, Libro.objects.all() es equivalente a hacer SELECT * FROM Libro.
  • context es un diccionario que contiene un par clave-valor, ahora podemos ver con claridad que “object_list” es la clave de dicho diccionario, y el valor serán todos los libros previamente consultados. Esta información será usada por la template que hemos creado para cargar en la vista todos los libros de la BBDD.
  • Al final, como en cualquier vista retornamos un objeto HttpResponse, pero ahora usaremos un atajo, la función render retorna el objeto HttpResponse, y recibe como parámetro el objeto request, la template asociada a la vista y su contexto.

Ahora tenemos views.py de esta forma

from django.shortcuts import render
from django.http import HttpResponse
from biblioteca.models import Editor, Autor, Libro #Importamos los modelos

def primer_vista(request):
	return HttpResponse("Hola, soy tu primera vista")

def books(request):
	all_books = Libro.objects.all()
	context = {'object_list':all_books}
	return render('biblioteca/allbooks.html', context)

Paso siguiente es ir a biblioteca/urls.py, para construir la url asociada a la vista.

from django.conf.urls import include, url
from . import views #Le decimos a Django que de este directorio importe el fichero views

urlpatterns = [
    url( r'^$' , views.primer_vista, name= 'primera-vista' ),
    url( r'^books/$', views.books, name='all-books'), #nueva url
]

Nada de lo que hemos hecho funcionará si no le indicamos a Django donde buscar las templates de nuestra aplicación, para ello debemos de dirigirnos a settings.py, específicamente en la variable TEMPLATES.

TEMPLATES = [
    {
		#...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        #...
    }    
]

Con lo anterior, ahora podemos dirigirnos al navegador y colocar en la barra de navegación localhost:8000/biblioteca/books.

allbooks

Cosas por decir acá:

  • He creado previamente por medio de la interfaz de administración 3 libros, los podemos ver en la anterior imagen.

  • Ahora nos damos cuenta qué es lo que significa “object_list” (lo único que hemos puesto en la template), la clave del contexto tiene el mismo nombre, lo que nos permite accesar la consulta hecha a la base de datos.

  • Vemos que el resultado de la consulta es un arreglo de objetos Libro, muy conveniente puesto que podemos recorrerlo con un bucle para mostrar cada uno de los atributos de los objetos.

  • ¿Recuerdas el método mágico _unicode_ que incluimos en cada modelo? (esto lo hicimos en esta entrada), ahora podemos ver su utilidad, sin este método, no podríamos identificar a los libros por su nombre (Crónicas de una muerta anunciada, Luna de Plutón …), es útil saber qué objetos están dentro del arreglo además, es una buena práctica.

¿Qué les parece si hacemos las cosas mas interesantes?

Vamos a crear una vista que nos permita tener los detalles de cada libro, para ello abrimos biblioteca/views.py y anexamos la siguiente función

def detail_book(request, id_book):
	book = Libro.objects.get(id=id_book)
	context = {'object':book}
	return render(request, 'biblioteca/detailbook.html', context)

La nueva función vista detail_book, recibe dos argumentos: el request y el id del libro que se quiere detallar. En el directorio de templates, crea un nuevo archivo llamado detailbook.html y dentro de el coloca


{{ object.id }} {{ object.titulo }} {{ object.editor }} {{ object.autores.get }}

Ahora vámonos a biblioteca/urls.py y asociemos una nueva url a la vista de detalles

from django.conf.urls import include, url
from . import views #Le decimos a Django que de este directorio importe el fichero views

urlpatterns = [
    url( r'^$' , views.primer_vista, name= 'primera-vista' ),
    url( r'^books/$', views.books, name='all-books'),
    url(r'^books/(\d+)/$', views.detail_book, name='detail-book'),#url para detalles
]

Te recomiendo que estudies un poco las expresiones regulares en python, te ayudará mucho saber como construirlas.

Por ultimo corremos el servidor de desarrollo y en la barra de navegación ponemos http://localhost:8000/biblioteca/books/2/ para ver los detalles del libro 2.

detailbook

Eso es todo por ahora, en la próxima entrada vamos a crear y actualizar Libros, pero esta vez con ayuda de las famosas Vistas genéricas, tambien vamos a mostrar un poco mejor la informacion de los Libros. Si tienes alguna duda, puedes dejarla más abajo en los comentarios. Nos vemos en otra ocasión.

print("Hasta pronto")

Siguiente artículo en la serie: La Biblioteca, aplicación en Django 1.8 | Parte VI

aplicacion, Django 1.8, Biblioteca
comments powered by Disqus