Professional Documents
Culture Documents
Herencia de Plantillas
Cmo reducimos la duplicacin y redundancia de las reas comunes de las pginas, como
por ejemplo, los paneles de navegacin?
Una forma clsica de solucionar este problema es usar includes, insertando dentro de las
pginas HTML a "incluir" una pgina dentro de otra. Es ms, Django admite esta
aproximacin, con la etiqueta {% include %} anteriormente descrita. Pero la mejor forma de
solucionar este problema con Django es usar una estrategia ms elegante llamada herencia
de plantillas.
En esencia, la herencia de plantillas te deja construir una plantilla base "esqueleto" que
contenga todas las partes comunes de tu sitio y definir "bloques" que los hijos puedan
sobrescribir. Este mtodo es bastante ms dinmico que el uso de la etiqueta include.
El sistema de herencia de Django soluciona estos problemas. Lo puedes pensar a esto como
la versin contraria a la del lado del servidor. En vez de definir los pedazos que son
comunes, defines los pedazos que son diferentes.
La herencia no afecta el funcionamiento del contexto, y puedes usar tantos niveles de
herencia como necesites. Una forma comn de utilizar la herencia es el siguiente enfoque de
tres niveles:
1. Crear una plantilla base.html que contenga el aspecto principal de tu sitio. Esto es lo
que rara vez cambiar, si es que alguna vez cambia.
2. Crear una plantilla base_SECTION.html para cada "seccin" de tu sitio (por ej.
base_photos.html y base_forum.html). Esas plantillas heredan de base.html e incluyen
secciones especficas de estilo/diseo.
3. Crear una plantilla individual para cada tipo de pgina, tales como pginas de
formulario o galera de fotos. Estas plantillas heredan de la plantilla de la seccin
apropiada.
Esta aproximacin maximiza la reutilizacin de cdigo y hace fcil el agregado de elementos
para compartir reas, como puede ser un navegador de seccin.
Aqu hay algunos consejos para el trabajo con herencia de plantillas:
Si usas {% extends %} en la plantilla, esta debe ser la primer etiqueta de esa plantilla.
En otro caso, la herencia no funcionar.
Generalmente, cuanto ms etiquetas {% block %} tengas en tus plantillas, mejor.
Recuerda, las plantillas hijas no tienen que definir todos los bloques del padre,
entonces puedes rellenar un nmero razonable de bloques por omisin, y luego definir
slo lo que necesiten las plantillas hijas. Es mejor tener ms conexiones que menos.
Si encuentras cdigo duplicado en un nmero de plantillas, esto probablemente
signifique que debes mover ese cdigo a un {% block %} en la plantilla padre.
Si necesitas obtener el contenido de un bloque desde la plantilla padre, la variable
{{ block.super }} har este truco. Esto es til si quieres agregar contenido del bloque
padre en vez de sobrescribirlo completamente.
No puedes definir mltiples etiquetas {% block %} con el mismo nombre en la misma
plantilla. Esta limitacin existe porque una etiqueta bloque trabaja en ambas
alberto@a-AMILO-Si-3655:~/django/tutorial/templates$ view
esqueleto.html
1 <!DOCTYPE html>
2 <html lang="es">
3 <head>
4
<meta charset="utf-8">
6 </head>
7 <body>
8
{% block content %}
10
11
12 </body>
Lnea 5: tenemos una nueva etiqueta, {% block %}. Esto indica que aqu hay un
contenido que se debe modificar por la plantilla hija o se quedar vaco.
Lnea 9-12: tenemos otro bloque pero este va con contenido. Qu significa? Significa
que si no hay ningn hijo que lo sobrescriba se mostrara el contenido del padre. En este caso
si ahora viramos este html el titulo estara vaco pero se mostrara que no hay contenido
que
mostrar.
Tenemos la plantilla padre, vamos a crear al hijo. Modificamos por completo nuestro fichero
suma.html con el siguiente contenido:
Cdigo :
Lnea 1: etiqueta que indica que esta plantilla hereda de esqueleto.html. Debe ser la
primera etiqueta si estamos creando una plantilla hija.
Lnea 5-7: sobrescribimos el bloque content de la plantilla padre. Eliminad estas lneas
y mirad lo que pasa.
Formularios HTML
Un formulario es una coleccin de campos que sabe cmo validarse a s mismo y mostrarse
como HTML.
Los formularios estn formados por determinados elementos como botones, cuadros de
texto, etc., dispuestos en un documento HTML. Si el usuario activa la pgina del documento,
se muestran los elementos del formulario. Entonces puede realizar las entradas o definir las
opciones. A travs de un botn Enviar puede transferirse los datos del formulario en el que
pueden introducirse el nombre del usuario y la direccin de correo electrnico.
En cuento el usuario enva los datos al servidor, estos pueden tratarse de la forma apropiada:
Los datos introducidos en el formulario pueden reenviarse a una direccin de correo
electrnico.
Los datos Introducidos pueden ser editados en el servidor mediante un script
CGI(Pearl, JavaScript, VBScript)
Search: El elemento representa una caja de bsqueda. Los saltos de lnea son quitados
del valor ingresado pero no se modifica ninguna otra sintaxis.
email: El elemento representa una direccin de correo electrnico. Los saltos de lnea se
quitan automticamente del valor ingresado. Puede ingresarse una direccin de correo no
vlida, pero el campo de ingreso slo funcionar si la direccin ingresada satisface la
produccin ABNF1*( atext / "." ) "@" ldh-str 1*( "." ldh-str ) donde atext est definida en
RFC 5322, seccin 3.2.3 y ldh-str est definida en RFC 1034, seccin 3.5.
Nota: si el atributo mltiple est agregado, pueden ingresarse muchas direcciones de correo
electrnico en ese campo <input>, como una lista separada por espacios, pero no est
implementado actualmente en Firefox.
El elemento <input> tambin tiene nuevos atributos:
list: El ID de un elemento <datalist> cuyo contenido, los elementos <option>, van a ser
usados como ayudas y sern mostrados como propuestas en el rea de sugerencias del
campo input.
pattern: Una expresin regular contra la que es verificado el valor del control, que
puede ser usada con valores de type de text, tel, search,url y email.
formmethod: Una cadena que indica qu mtodo HTTP (GET, POST, PUT o
DELETE) debe ser usado cuando se enva; sobrescribe el method del elemento <form>, si se
define. El formmethod slo se aplica cuando el type es image o submit, y, para los mtodos
PUT y DELETE, slo funcionar con un destino que est en el mismo dominio (poltica del
mismo origen).
novalidate: Este atributo previene que el formulario sea validado antes del envo.
o
o
o
o
o
forms.py import
Estas lneas permitirn usar los elementos ya construidos (ModelForm para usar los modelos
ya declarados, forms para declarar nuevas reglas para un formulario y los modelos de
nuestra aplicacin principal)
Cuando Django fue lanzado al pblico por primera vez, posea un sistema de formularios
complicado y confuso. Como haca muy dificultosa la produccin de formularios, fue rescrito
y ahora se llama "newforms" (nuevos formularios). Sin embargo, como todava hay cierta
cantidad de cdigo que depende del "viejo" sistema de formularios, Django actualmente
viene con ambos paquetes.
from django import newforms as forms
Contexto.
Un contexto es simplemente un conjunto de variables y sus valores asociados. Una plantilla
usa estas variables para llenar y evaluar estas etiquetas de bloque.
Cuando una plantilla debe ser renderizada, necesita un contexto. Usualmente este contexto
es una instancia de django.template.Context, pero Django tambin provee una subclase
especial: django.template.RequestContext que acta de una manera levemente diferente.
RequestContext agrega muchas variables al contexto de nuestra plantilla cosas como el
objeto HttpRequest o informacin acerca del usuario que est siendo usado actualmente.
Un contexto es representado en Django por la clase Context, sta se encuentra en el mdulo
django.template. Su constructor toma un argumento opcional: un diccionario que mapea
nombres de variables con valores. Llama al mtodo render() del objeto Template con el
contexto para "llenar" la plantilla:
>>> from django.template import Context, Template
>>> t = Template("My name is {{ name }}.")
>>> c = Context({"name": "Stephane"})
>>> t.render(c)
'My name is Stephane.'
Los nombres de las variables deben comenzar con una letra (A-Z o a-z) y pueden contener
dgitos, guiones bajos y puntos. (Los puntos son un caso especial al que llegaremos en un
momento). Los nombres de variables son sensible a maysculas-minsculas.
>>> from django.template import Template, Context
>>> raw_template = """<p>Dear {{ person_name }},</p>...
... <p>Thanks for ordering {{ product }} from {{ company }}. It's scheduled
... to ship on {{ ship_date|date:"F j, Y" }}.</p>...
... {% if ordered_warranty %}
... <p>Your warranty information will be included in the packaging.</p>
... {% endif %}
...
... <p>Sincerely,<br />{{ company }}</p>"""
>>> t = Template(raw_template)
>>> import datetime
>>> c = Context({'person_name': 'John Smith',
...
...
'ordered_warranty': True})
>>> t.render(c)
"<p>Dear John Smith,</p>\n\n<p>Thanks for ordering Super Lawn Mower from
Outdoor Equipment. It's scheduled \nto ship on April 2, 2009.</p>\n\n\n
<p>Your warranty information will be included in the packaging.</p>\n\n\n
<p>Sincerely,<br />Outdoor Equipment</p>"
Vamos paso a paso por este cdigo, de a una sentencia a la vez:
mdulo django.template.
Guardamos en texto crudo de nuestra plantilla en la variable raw_template. Note que
usamos triple comillas para delimitar la cadena de caracteres, debido a que abarca
varias lneas; en el cdigo Python, las cadenas de caracteres delimitadas con una sola
comilla indican que no puede abarcar varias lneas.
Luego, creamos un objeto plantilla, t, pasndole raw_template al constructor de la
clase Template.
Importamos el mdulo datetime desde la librera estndar de Python, porque lo vamos
diccionario de Python, el cual mapea nombres de variables con valores. Aqu, por
ejemplo, especificamos que person_name es 'John Smith', product es'Super Lawn
Mower', y as sucesivamente.
Finalmente, llamamos al mtodo render() sobre nuestro objeto de plantilla, pasando a
ste el contexto. Este retorna la plantilla renderizada, esto es, reemplaza las variables de
la plantilla con los valores reales de las variables, y ejecuta cualquier bloque de
etiquetas.
Nota que el prrafo de garanta fue mostrado porque la variable ordered_warranty se
evala como True. Tambin nota que la fecha April 2, 2009, es mostrada acorde al
formato de cadena de caracteres F j, Y.
Estos son los fundamentos del uso del sistema de plantillas de Django: slo escribe una
plantilla, crea un objetoTemplate, crea un Context, y llama al mtodo render().
2Bibliografa
ach4m0. (09 de Febrero de 2012). Cristalab. Obtenido de http://www.cristalab.com/tutoriales/python-