<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cibernatural S.L. &#187; Web</title>
	<atom:link href="http://www.cibernatural.com/tag/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cibernatural.com</link>
	<description>Páginas web en Lanzarote y Desarrollo de software profesional - Islas Canarias</description>
	<lastBuildDate>Thu, 19 Aug 2010 10:41:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Gestión web de clientes y facturación en Django</title>
		<link>http://www.cibernatural.com/gestion-web-de-clientes-y-facturacion-en-django/</link>
		<comments>http://www.cibernatural.com/gestion-web-de-clientes-y-facturacion-en-django/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 16:33:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Facturación]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ReportLab]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=656</guid>
		<description><![CDATA[Cibernatural S.L. estrena una nueva y sencilla aplicación web de Gestión de clientes y facturas, presupuestos, partes de entrega y abonos, desarrollada completamente a partir del Sitio de Administración de Django, que proporciona una interfaz limpia y eficiente. Con ella, se puede gestionar una empresa fácilmente en cualquier momento, lugar y desde cualquier dispositivo que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cibernatural.com">Cibernatural S.L.</a> estrena una nueva y sencilla <strong>aplicación web de Gestión de clientes y facturas</strong>, presupuestos, partes de entrega y abonos, desarrollada completamente a partir del Sitio de Administración de <strong>Django</strong>, que proporciona una interfaz limpia y eficiente.</p>
<p>Con ella, se puede gestionar una empresa fácilmente en cualquier momento, lugar y desde cualquier dispositivo que disponga de un navegador e Internet (ordenador, portátil, teléfono móvil, etc.), sin necesidad de ninguna instalación,  etc.</p>
<p>La aplicación permite la búsqueda y edición de cualquier cliente, factura, presupuesto, etc., de forma rápida y sencilla, así como la generación en PDF de cualquiera de estos elementos personalizados para la empresa usuaria de la aplicación. Además, permite realizar varias tareas con un solo click, como volcar un presupuesto en una factura, etc., y proporciona multitud de listados estadísticos en PDF como por ejemplo, resúmenes de facturación por meses, por trimestres, por años, por clientes, etc.</p>
<p>Algunas empresas como <a href="http://www.lasillitadecanarias.com">La Sillita de Canarias</a> ya están utilizando esta aplicación, que pretende simplificar la facturación de la empresa y llevarla a la &#8220;nube&#8221; para gestionar su empresa cuándo y donde quiera.</p>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=656">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/gestion-web-de-clientes-y-facturacion-en-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Corporativa de Transportes y Excavaciones Tiagua</title>
		<link>http://www.cibernatural.com/web-corporativa-de-transportes-y-excavaciones-tiagua/</link>
		<comments>http://www.cibernatural.com/web-corporativa-de-transportes-y-excavaciones-tiagua/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 17:44:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Construcción]]></category>
		<category><![CDATA[Lanzarote]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=633</guid>
		<description><![CDATA[Cibernatural S.L. estrena la nueva web corporativa de la importante empresa del sector de la construcción en Lanzarote Transportes y Excavaciones Tiagua. http://www.excavacionestiagua.com En ella se pretende ir mostrando todos y cada uno de los productos y servicios que ofrece la empresa, entre los que destacan todo tipo de trabajos de Excavaciones, Movimiento de Tierras, [...]]]></description>
			<content:encoded><![CDATA[<p>Cibernatural S.L. estrena la nueva web corporativa de la importante empresa del sector de la construcción en Lanzarote Transportes y Excavaciones Tiagua.</p>
<p><a href="http://www.excavacionestiagua.com">http://www.excavacionestiagua.com</a></p>
<p>En ella se pretende ir mostrando todos y cada uno de los productos y servicios que ofrece la empresa, entre los que destacan todo tipo de trabajos de <strong>Excavaciones, Movimiento de Tierras, Demoliciones, Cimentaciones, etc.</strong>, así como de <strong>Transportes y Grúas</strong> para toda la isla de <strong>Lanzarote</strong>.</p>
<p>También, la página permite realizar comentarios de cada una de las noticias o novedades mostradas, con objeto de acercar al cliente o proveedor a la empresa, en cualquier momento y en cualquier lugar.</p>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=633">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/web-corporativa-de-transportes-y-excavaciones-tiagua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimización de motores de búsqueda de Agentes Comerciales de Gestión</title>
		<link>http://www.cibernatural.com/optimizacion-de-motores-de-busqueda-de-agentes-comerciales-de-gestion/</link>
		<comments>http://www.cibernatural.com/optimizacion-de-motores-de-busqueda-de-agentes-comerciales-de-gestion/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 10:59:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Canarias]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Las Palmas]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=583</guid>
		<description><![CDATA[La empresa de Representación Comercial en Canarias ACG Representaciones, con objeto de mejorar el posicionamiento en buscadores, ha vuelto a confiar en Cibernatural para realizar el SEO (Optimización de motores de búsqueda) a la web corporativa de la empresa. Se han realizado múltiples mejoras, entre las cuales destacan: Mejoras en la indexación del contenido y [...]]]></description>
			<content:encoded><![CDATA[<p>La empresa de <a href="http://www.agentescomercialesdegestion.com">Representación Comercial en Canarias ACG Representaciones</a>, con objeto de mejorar el posicionamiento en buscadores, ha vuelto a confiar en Cibernatural para realizar el SEO (Optimización de motores de búsqueda) a la web corporativa de la empresa.</p>
<p>Se han realizado múltiples mejoras, entre las cuales destacan:</p>
<ul>
<li>Mejoras en la indexación del contenido y de los elementos gráficos de las páginas</li>
<li>Aumento de la indexabilidad en los sistemas de navegación del sitio web</li>
<li>Alta y notificación de modificaciones en buscadores genéricos</li>
<li>Generación de etiquetas</li>
</ul>
<h3>Enlaces Relacionados</h3>
<ul>
<li><a href="http://www.agentescomercialesdegestion.com">http://www.agentescomercialesdegestion.com</a></li>
</ul>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=583">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/optimizacion-de-motores-de-busqueda-de-agentes-comerciales-de-gestion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Directorio de Casas Rurales en Lanzarote</title>
		<link>http://www.cibernatural.com/directorio-de-casas-rurales-en-lanzarote/</link>
		<comments>http://www.cibernatural.com/directorio-de-casas-rurales-en-lanzarote/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 17:31:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Lanzarote]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Turismo]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=534</guid>
		<description><![CDATA[Cibernatural S.L. estrena el nuevo portal de Casas Rurales de la isla de Lanzarote. http://www.casasruraleslanzarote.com Dicho portal pretende servir como directorio de las Casas Rurales en Lanzarote que sus propietarios quieran poner en Alquiler, para que los clientes potenciales puedan acceder a toda la información de cada una de las casas rurales del directorio, así [...]]]></description>
			<content:encoded><![CDATA[<p>Cibernatural S.L. estrena el nuevo portal de <strong><a href="http://www.casasruraleslanzarote.com">Casas Rurales de la isla de Lanzarote</a></strong>.</p>
<p><a href="http://www.casasruraleslanzarote.com">http://www.casasruraleslanzarote.com</a></p>
<p>Dicho portal pretende servir como directorio de las <strong>Casas Rurales en Lanzarote</strong> que sus propietarios quieran poner en Alquiler, para que los clientes potenciales puedan acceder a toda la información de cada una de las casas rurales del directorio, así como a otra información relacionada con el turismo rural en Lanzarote como el Entorno, las Actividades a realizar (Senderismo, Rutas, etc.), Guias de transporte, etc.</p>
<p><a title="Casas Rurales en Lanzarote" href="http://www.casasruraleslanzarote.com"><img class="size-full wp-image-539 alignnone" title="logo-casasrurales-lanzarote" src="http://www.cibernatural.com/wp-content/uploads/2010/04/logo-casasrurales-lanzarote.jpg" alt="" width="496" height="60" /></a></p>
<p>Está disponible de momento en 5 idiomas: Castellano, Inglés, Fránces, Alemán y Catalán.</p>
<p>En breve, se pondrá en marcha un <strong>módulo de gestión de reservas on-line</strong> de las Casas Rurales de Lanzarote, para que los clientes puedan realizar su reserva de forma sencilla y cómoda.</p>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=534">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/directorio-de-casas-rurales-en-lanzarote/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial de Django &#8211; III</title>
		<link>http://www.cibernatural.com/tutorial-de-django-iii/</link>
		<comments>http://www.cibernatural.com/tutorial-de-django-iii/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 12:26:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=509</guid>
		<description><![CDATA[Plantillas &#8211; Templates No es una buena idea codificar el HTML directamente en las vistas. Es mucho más limpio y más fácil de mantener separar el diseño de la página del código Python. Podemos hacer esto con el sistema de plantillas de Django. Base del Sistema de Plantillas Una plantilla de Django es una cadena de [...]]]></description>
			<content:encoded><![CDATA[<h2><strong><span style="text-decoration: underline;">Plantillas &#8211; Templates</span></strong></h2>
<p>No es una buena idea codificar el HTML directamente en las vistas.</p>
<p>Es mucho más limpio y más fácil de mantener <strong>separar el diseño de la página del código Python</strong>. Podemos hacer esto con el sistema de plantillas de Django.</p>
<h3>Base del Sistema de Plantillas</h3>
<p>Una plantilla de Django es una cadena de texto para separar la presentación de un documento de sus datos. Una plantilla define contenedores y varios bits de lógica básica (etiquetas) que regulan la forma en que el documento debe ser mostrado. Por lo general las plantillas se utilizan para producir HTML, pero las plantillas Django plantillas son igualmente capaces de generar cualquier otro formato basado en texto.</p>
<p>Comencemos con una plantilla sencilla de ejemplo. Esta plantilla Django describe una página HTML que, da las gracias a una persona por hacer un pedido a la empresa.</p>
<blockquote><p>&lt;html&gt;</p>
<p>&lt;head&gt;&lt;title&gt;Ordering notice&lt;/title&gt;&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;h1&gt;Ordering notice&lt;/h1&gt;</p>
<p>&lt;p&gt;Dear {{ person_name }},&lt;/p&gt;</p>
<p>Thanks for placing an order from {{ company }}. It&#8217;s scheduled to<br />
ship on {{ ship_date|date:&#8221;F j, Y&#8221; }}.</p>
<p>Here are the items you&#8217;ve ordered:<br />
&lt;ul&gt;<br />
{% for item in item_list %}<br />
	&lt;li&gt;{{ item }}&lt;/li&gt;<br />
{% endfor %}<br />
&lt;/ul&gt;<br />
{% if ordered_warranty %}</p>
<p>Your warranty information will be included in the packaging.</p>
<p>{% else %}</p>
<p>You didn&#8217;t order a warranty, so you&#8217;re on your own when<br />
the products inevitably stop working.</p>
<p>{% endif %}</p>
<p>Sincerely,<br />
{{ company }}
</p></blockquote>
<p>Esta plantilla es HTML básico con algunas variables y etiquetas de plantilla dentro de ella. Cualquier texto rodeado por un par de llaves (por ejemplo, {{ person_name }}) es una variable. Esto significa &#8220;insertar el valor de la variable con el nombre dado.&#8221; ¿Cómo podemos especificar los valores de las variables?Llegaremos a eso después.</p>
<p>Cualquier texto que está rodeado de llaves y porcentaje (por ejemplo, {% if ordered_warranted %}) es una etiqueta de plantilla. La definición de una etiqueta es bastante amplia: una etiqueta sólo le dice al sistema de plantillas &#8220;haz algo&#8221;.</p>
<p>Por último, el segundo párrafo de esta plantilla contiene un ejemplo de filtro, que es la forma más conveniente de modificar el formato de una variable. En este ejemplo, {{ ship_date | date: &#8220;F j, Y&#8221; }}, estamos pasandole a la variable ship_date el filtro date, dándole al filtro date el argumento &#8220;F j, Y&#8221;. El formato de filtro date formatea las fechas a un formato dado, como se especifica en el argumento. Los filtros son adjuntados con un carácter de canalización (|).</p>
<p>Cada plantilla Django tiene acceso a varias etiquetas y filtros incorporados, muchos de los cuales serán discutidos en las siguientes secciones.</p>
<h3>Usando el sistema de plantillas</h3>
<p>Entremos en el sistema de plantillas de Django para que cómo funciona, pero no estamos todavía para integrarlo con las vistas que hemos creado en el capítulo anterior. Nuestro objetivo aquí es <strong>mostrar cómo funciona el sistema independiente del resto de Django</strong>. (Por lo general vamos a usar el sistema de plantillas dentro de una vista de Django, pero hay que dejar claro que el sistema de plantillas es sólo una librería de Python que se puede utilizar en cualquier lugar, no sólo en las vistas de Django.)</p>
<p>Esta es la forma más básica en que se puede utilizar el sistema de plantillas de Django:</p>
<ol>
<li>Crear un objeto Template proporcionando el código de la plantilla raw como una cadena.</li>
<li>Llamar al método render () del objeto Template con un conjunto de variables (el contexto). Esto devuelve una plantilla renderizada completamente como una cadena, con todas las variables y etiquetas de plantilla evaluadas de acuerdo al contexto.</li>
</ol>
<blockquote><p>&gt;&gt;&gt; from django import template<br />
&gt;&gt;&gt; t = template.Template(&#8216;My name is {{ name }}.&#8217;)<br />
&gt;&gt;&gt; c = template.Context({&#8216;name&#8217;: &#8216;Adrian&#8217;})<br />
&gt;&gt;&gt; print t.render(c)<br />
My name is Adrian.</p>
<p>&gt;&gt;&gt; c = template.Context({&#8216;name&#8217;: &#8216;Fred&#8217;})<br />
&gt;&gt;&gt; print t.render(c)<br />
My name is Fred.</p></blockquote>
<h3>Crear objetos Template</h3>
<p>La forma más fácil de crear un objeto <em>Template</em> es crear una instancia directamente. La clase <em>Template</em> reside en el módulo django.template, y el constructor toma un argumento, el código de plantilla raw.</p>
<p>Veamos algunos aspectos básicos del sistema de plantillas:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template<br />
&gt;&gt;&gt; t = Template(&#8216;My name is {{ name }}.&#8217;)<br />
&gt;&gt;&gt; print t</p></blockquote>
<p>Si lo estamos haciendo de forma interactiva, veremos algo como esto:</p>
<p>&lt;django.template.Template object at 0xb7d5f24c&gt;</p>
<p>Cuando se crea un objeto Template, el sistema de plantillas compila el código de la plantilla raw internamente de forma optimizada, preparándolo para el renderizado. Pero si el código de la plantilla incluye cualquier error de sintaxis, la llamada a Template() producirá una excepción <em>TemplateSyntaxError</em>.</p>
<h3>Renderizar un Template</h3>
<p>Una vez que tiene un objeto Template, puede pasarle datos, dándole un contexto. Un contexto es simplemente un conjunto de nombres de variables de plantilla y sus valores asociados. Una plantilla usa un contexto para rellenar sus variables y evaluar sus etiquetas.</p>
<p>Un contexto es representado en Django por la clase <em>Context</em>, que reside en el módulo django.template. Su constructor toma un argumento opcional: un diccionario que mapea los nombres de variables a los valores de las variables. Llamar al método render() del objeto Template con el contexto para rellenar la plantilla:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Context, Template<br />
&gt;&gt;&gt; t = Template(&#8216;My name is {{ name }}.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;name&#8217;: &#8216;Stephane&#8217;})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;My name is Stephane.&#8217;</p></blockquote>
<p>Debemos señalar aquí que el valor de retorno de t.render(c) es un objeto Unicode – no una cadena Python normal.  Django utiliza objetos Unicode en lugar de cadenas normales en todo el framework.</p>
<p>He aquí un ejemplo de compilar y renderizar una plantilla, usando una plantilla similar a la ejemplo del principio de este capítulo:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; raw_template = &#8220;&#8221;"</p>
<p>Dear {{ person_name }},</p>
<p>&#8230;<br />
&#8230;  &lt;p&gt;Thanks for placing an order from {{ company }}. It&#8217;s scheduled to<br />
&#8230; ship on {{ ship_date|date:&#8221;F j, Y&#8221; }}.&lt;/p&gt;</p>
<p>&#8230;<br />
&#8230; {% if ordered_warranty %}<br />
&#8230; &lt;p&gt;Your warranty information will be included in the packaging.&lt;/p&gt;</p>
<p>&#8230; {% else %}<br />
&#8230; &lt;p&gt;You didn&#8217;t order a warranty, so you&#8217;re on your own when<br />
&#8230; the products inevitably stop working.&lt;/p&gt;</p>
<p>&#8230; {% endif %}<br />
&#8230;<br />
&#8230;  &lt;p&gt;Sincerely, &lt;br/&gt;{{ company }} &lt;p&gt; &#8220;&#8221;"<br />
&gt;&gt;&gt; t = Template(raw_template)<br />
&gt;&gt;&gt; import datetime<br />
&gt;&gt;&gt; c = Context({&#8216;person_name&#8217;: &#8216;John Smith&#8217;,<br />
&#8230; &#8216;company&#8217;: &#8216;Outdoor Equipment&#8217;,<br />
&#8230; &#8216;ship_date&#8217;: datetime.date(2009, 4, 2),<br />
&#8230; &#8216;ordered_warranty&#8217;: False})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8221; &lt;p&gt;Dear John Smith,&lt;/p&gt;\n\n&lt;p&gt;Thanks for placing an order from Outdoor Equipment. It&#8217;s scheduled to\nship on April 2, 2009.&lt;/p&gt;\n\n\n&lt;p&gt;You didn&#8217;t order a warranty, so you&#8217;re on your own when\nthe products inevitably stop working.&lt;/p&gt;\n\n\n&lt;p&gt;Sincerely,Outdoor Equipment&lt;/p&gt;&#8221;
</p></blockquote>
<ol>
<li>Primero importamos las clases Template y Context, ambas residen en el módulo django.template.</li>
<li>Guardamos el texto raw de nuestra plantilla en la variable raw_template. Tenga en cuenta que usamos comillas triples para designar a la cadena, ya que se extiende por varias líneas, por contra, las cadenas entre comillas sencillas no pueden ser envueltas en varias líneas.</li>
<li>A continuación creamos un objeto plantilla, t, pasando raw_template al constructor de la clase Template.</li>
<li>Importamos el módulo de fecha y hora de la librería estándar de Python, porque la necesitaremos en la siguiente declaración.</li>
<li>Creamos un objeto Context, c. El constructor de Context, toma un diccionario Python, que mapea los nombres de variable a los valores. Aquí, por ejemplo, se especifica que persona_name es &#8216;John Smith&#8217;, company es &#8216;Outdoor Equipment &#8220;, y así sucesivamente.</li>
<li>Por último, llamamos al método render () de nuestro objeto plantilla, pasándole el contexto. Esto devuelve la plantilla renderizada, es decir, que reemplaza las variables de la plantilla con los valores actuales de las variables, y ejecuta cualquier etiqueta de la plantilla.</li>
</ol>
<p>Esos son los fundamentos del uso del sistema de plantillas de Django: simplemente <strong>escribir una cadena de plantilla, crear un objeto Template, crear un Context, y llamar al método render().</strong></p>
<h3>Múltiples contextos, misma plantilla</h3>
<p>Una vez que tiene un objeto Template, usted puede renderizar múltiples contextos a través de él. Considere este ejemplo:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; t = Template(&#8216;Hello, {{ name }}&#8217;)<br />
&gt;&gt;&gt; print t.render(Context({&#8216;name&#8217;: &#8216;John&#8217;}))<br />
Hello, John<br />
&gt;&gt;&gt; print t.render(Context({&#8216;name&#8217;: &#8216;Julie&#8217;}))<br />
Hello, Julie<br />
&gt;&gt;&gt; print t.render(Context({&#8216;name&#8217;: &#8216;Pat&#8217;}))<br />
Hello, Pat</p></blockquote>
<p>Cada vez que usted está utilizando la misma plantilla para renderizar múltiples contextos, es más eficiente crear el objeto plantilla una vez, y luego llamar a render() sobre él varias veces:</p>
<blockquote><p># Bad<br />
for name in (&#8216;John&#8217;, &#8216;Julie&#8217;, &#8216;Pat&#8217;):<br />
t = Template(&#8216;Hello, {{ name }}&#8217;)<br />
print t.render(Context({&#8216;name&#8217;: name}))</p>
<p># Good<br />
t = Template(&#8216;Hello, {{ name }}&#8217;)<br />
for name in (&#8216;John&#8217;, &#8216;Julie&#8217;, &#8216;Pat&#8217;):<br />
print t.render(Context({&#8216;name&#8217;: name}))</p></blockquote>
<h3>Búsqueda de variable de Contexto</h3>
<p>En los ejemplos hasta ahora, hemos pasado valores simples a los contextos &#8211; en su mayoría cadenas, además de un datetime.date. Sin embargo, <strong>el sistema de plantillas maneja estructuras de datos complejas, tales como listas, diccionarios, y objetos personalizados</strong>.</p>
<p>La clave para atravesar estructuras complejas de datos en las plantillas Django es el <em>carácter de punto (.)</em>. Utilice un punto para acceder a las claves del diccionario, atributos, métodos, o índices de un objeto.</p>
<p>Por ejemplo, supongamos que usted está pasando un diccionario Python a una plantilla. Para acceder a los valores de ese diccionario por clave de diccionario, use el punto:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; person = {&#8216;name&#8217;: &#8216;Sally&#8217;, &#8216;age&#8217;: &#8217;43&#8242;}<br />
&gt;&gt;&gt; t = Template(&#8216;{{ person.name }} is {{ person.age }} years old.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;person&#8217;: person})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;Sally is 43 years old.&#8217;</p></blockquote>
<p>Del mismo modo, los puntos también permiten el acceso a los atributos de los objetos. Por ejemplo, un objeto datetime.date de Python tiene atributos año, mes, día, y puede utilizar un punto para acceder a esos atributos en una plantilla Django:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; import datetime<br />
&gt;&gt;&gt; d = datetime.date(1993, 5, 2)<br />
&gt;&gt;&gt; d.year<br />
1993<br />
&gt;&gt;&gt; d.month<br />
5<br />
&gt;&gt;&gt; d.day<br />
2<br />
&gt;&gt;&gt; t = Template(&#8216;The month is {{ date.month }} and the year is {{ date.year }}.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;date&#8217;: d})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;The month is 5 and the year is 1993.&#8217;</p></blockquote>
<p>Este ejemplo utiliza una clase personalizada, lo que demuestra que los puntos permiten también el acceso a atributos de objetos arbitrarios:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; class Person(object):</p>
<p style="padding-left: 30px;"> def __init__(self, first_name, last_name):</p>
<p style="padding-left: 60px;">self.first_name, self.last_name = first_name, last_name</p>
<p>&gt;&gt;&gt; t = Template(&#8216;Hello, {{ person.first_name }} {{ person.last_name }}.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;person&#8217;: Person(&#8216;John&#8217;, &#8216;Smith&#8217;)})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;Hello, John Smith.&#8217;</p></blockquote>
<p>Los puntos también puede hacer referencia a métodos de objetos. Por ejemplo, cada cadena Python tiene los métodos upper() y isdigit(), y usted puede llamarlos en las plantillas Django, usando la misma sintaxis del punto:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; t = Template(&#8216;{{ var }}—{{ var.upper }}—{{ var.isdigit }}&#8217;)<br />
&gt;&gt;&gt; t.render(Context({&#8216;var&#8217;: &#8216;hello&#8217;}))<br />
u&#8217;hello—HELLO—False&#8217;<br />
&gt;&gt;&gt; t.render(Context({&#8216;var&#8217;: &#8217;123&#8242;}))<br />
u&#8217;123—123—True&#8217;</p></blockquote>
<p>Tenga en cuenta que no se incluyen los paréntesis en las llamadas a métodos. Además, no es posible pasar argumentos a los métodos, sólo puede llamar a métodos que no requieren argumentos.</p>
<p>Por último, los puntos también se utilizan para acceder a los índices de lista, como en este ejemplo:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; t = Template(&#8216;Item 2 is {{ items.2 }}.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;items&#8217;: ['apples', 'bananas', 'carrots']})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;Item 2 is carrots.&#8217;
</p></blockquote>
<p>Las búsquedas de puntos se pueden resumir así: cuando la plantilla se encuentra con un punto en un nombre de variable, trata las búsquedas siguientes, en este orden:</p>
<ul>
<li>Diccionario (por ejemplo, foo["bar"])</li>
<li>Atributo (por ejemplo, foo.bar)</li>
<li>Llamada a método (por ejemplo, foo.bar())</li>
<li>Índice de Lista (por ejemplo, foo[2])</li>
</ul>
<p>El sistema utiliza el tipo de búsqueda que funciona primero. Es una falta de lógica del circuito.<br />
Las búsquedas del punto se pueden anidar varios niveles de profundidad. Por ejemplo, el ejemplo siguiente  utiliza {{ person.name.upper() }}, que se traduce en una búsqueda de diccionario (person['name']) y luego<br />
una llamada al método (upper()):</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; person = {&#8216;name&#8217;: &#8216;Sally&#8217;, &#8216;age&#8217;: &#8217;43&#8242;}<br />
&gt;&gt;&gt; t = Template(&#8216;{{ person.name.upper }} is {{ person.age }} years old.&#8217;)<br />
&gt;&gt;&gt; c = Context({&#8216;person&#8217;: person})<br />
&gt;&gt;&gt; t.render(c)<br />
u&#8217;SALLY is 43 years old.&#8217;</p></blockquote>
<h3>Comportamiento de llamada a método</h3>
<p>Las llamadas a los métodos son un poco más complejas que el de otros tipos de búsqueda. Aquí hay algunas cosas a tener en cuenta.</p>
<p>Si, durante la búsqueda de métodos, un método produce una excepción, la excepción se propagará a menos que la excepción tenga un atributo silent_variable_failure a True. Si la excepción tiene un atributo silent_variable_failure, la variable se renderizará como una cadena vacía, como en este ejemplo:</p>
<blockquote><p>&gt;&gt;&gt; t = Template(&#8220;My name is {{ person.first_name }}.&#8221;)<br />
&gt;&gt;&gt; class PersonClass3:</p>
<p style="padding-left: 30px;">def first_name(self):</p>
<p style="padding-left: 60px;">raise AssertionError, &#8220;foo&#8221;</p>
<p>&gt;&gt;&gt; p = PersonClass3()<br />
&gt;&gt;&gt; t.render(Context({&#8220;person&#8221;: p}))<br />
Traceback (most recent call last):<br />
&#8230;<br />
AssertionError: foo<br />
&gt;&gt;&gt; class SilentAssertionError(AssertionError):<br />
&#8230; 	silent_variable_failure = True<br />
&gt;&gt;&gt; class PersonClass4:<br />
&#8230;
<p style="padding-left: 30px;">def first_name(self):</p>
<p>&#8230;
<p style="padding-left: 60px;">raise SilentAssertionError</p>
<p>&gt;&gt;&gt; p = PersonClass4()<br />
&gt;&gt;&gt; t.render(Context({&#8220;person&#8221;: p}))<br />
u&#8217;My name is .&#8217;</p></blockquote>
<p>Una llamada al método sólo funcionará si el método no requiere argumentos. De lo contrario, el el sistema se moverá al siguiente tipo de búsqueda (índice de lista).<br />
Obviamente, algunos métodos tienen efectos colaterales y sería absurdo, y, posiblemente, incluso un agujero de seguridad, permitir al sistema de plantillas acceder a ellos. Digamos, por ejemplo, que tiene un objeto BackAccount que tiene un método delete(). Si una plantilla incluye algo como {{ account.delete() }}, donde account es un objeto BankAccount, el objeto sería eliminado al procesar la plantilla. Para evitar esto, establezca el atributo de función alters_data en el método:</p>
<blockquote><p>def delete(self):</p>
<p style="padding-left: 30px;"># Delete the account</p>
<p style="padding-left: 30px;">delete.alters_data = True</p>
</blockquote>
<p>El sistema de plantillas no ejecutará cualquier método marcado de esta manera. Continuando con el ejemplo actual, si una plantilla incluye {{ account.delete }} y el método delete() tienen alters_data = True, entonces el método delete() no se ejecutará cuando la plantilla se renderice. En su lugar, se producirá un error silencioso.</p>
<h3>¿Cómo se gestionan las variables inválidas?</h3>
<p>Por defecto, si una variable no existe el sistema de plantillas la renderiza como una cadena vacía, error silencioso. Considere este ejemplo:</p>
<p>¡</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Template, Context<br />
&gt;&gt;&gt; t = Template(&#8216;Your name is {{ name }}.&#8217;)<br />
&gt;&gt;&gt; t.render(Context())<br />
u&#8217;Your name is .&#8217;<br />
&gt;&gt;&gt; t.render(Context({&#8216;var&#8217;: &#8216;hello&#8217;}))<br />
u&#8217;Your name is .&#8217;<br />
&gt;&gt;&gt; t.render(Context({&#8216;NAME&#8217;: &#8216;hello&#8217;}))<br />
u&#8217;Your name is .&#8217;<br />
&gt;&gt;&gt; t.render(Context({&#8216;Name&#8217;: &#8216;hello&#8217;}))<br />
u&#8217;Your name is .&#8217;</p></blockquote>
<h3>Jugar con objetos Context</h3>
<p>La mayoría de las veces, usted instanciará objetos <em>Context</em> pasando un diccionario totalmente lleno a Context(). Pero usted también puede añadir y eliminar elementos de un objeto Context, una vez instanciado,usando la sintaxis estándar de Python diccionario:</p>
<blockquote><p>&gt;&gt;&gt; from django.template import Context<br />
&gt;&gt;&gt; c = Context({&#8220;foo&#8221;: &#8220;bar&#8221;})<br />
&gt;&gt;&gt; c['foo']<br />
&#8216;bar&#8217;<br />
&gt;&gt;&gt; del c['foo']<br />
&gt;&gt;&gt; c['foo']<br />
Traceback (most recent call last):<br />
&#8230;<br />
KeyError: &#8216;foo&#8217;<br />
&gt;&gt;&gt; c['newvariable'] = &#8216;hello&#8217;<br />
&gt;&gt;&gt; c['newvariable']<br />
&#8216;hello&#8217;</p></blockquote>
<h3>Etiquetas y Filtros de Plantilla Básica</h3>
<p><strong>Etiquetas</strong></p>
<p><strong>if / else</strong></p>
<p>La etiqueta {% if %} evalúa una variable, y si esa variable es True (es decir, que existe, no está vacío, y no es un valor boolean FALSE), el sistema mostrará todo entre {% if %} y {% endif %}, como en este ejemplo:</p>
<blockquote><p>{% if today_is_weekend %}</p>
<p style="padding-left: 30px;">Welcome to the weekend!</p>
<p>{% endif %}</p></blockquote>
<p>Una etiqueta {% else %} es opcional:</p>
<blockquote><p>{% if today_is_weekend %}</p>
<p style="padding-left: 30px;">Welcome to the weekend!</p>
<p>{% else %}</p>
<p style="padding-left: 30px;">Get back to work.</p>
<p>{% endif %}</p></blockquote>
<p><strong>for</strong></p>
<p>La etiqueta {% for %} permite un bucle sobre cada elemento de una secuencia. La plantilla renderizará todo entre {% for %} y {% endfor %}.</p>
<p>Por ejemplo, podría utilizar el siguiente ejemplo para mostrar una lista de atletas dada una variable athlete_list:</p>
<blockquote><p>
&lt;ul&gt; {% for athlete in athlete_list %}</p>
<p style="padding-left: 30px;">&lt;li&gt;{{ athlete.name }}&lt;/li&gt;</p>
<p>{% endfor %}<br />
&lt;/ul&gt;
</p></blockquote>
<p>y al revés:</p>
<blockquote><p>
{% for athlete in athlete_list reversed %}<br />
&#8230;<br />
{% endfor %}</p></blockquote>
<p>Es posible anidar etiquetas {% for %}.</p>
<p>La etiqueta for soporta una clausula opcional {% empty %}  que le permite definir que salida si la lista está vacía.</p>
<blockquote><p>{% for athlete in athlete_list %}</p>
<p style="padding-left: 30px;">{{ athlete.name }}</p>
<p>{% empty %}</p>
<p style="padding-left: 30px;">There are no athletes. Only computer programmers.</p>
<p>{% endfor %}
</p></blockquote>
<p>No hay soporte para opciones del tipo break y continue.</p>
<p>Dentro de cada bucle {% for %} usted puede acceder a una variable llamada forloop. Esta variable tiene algunas características que le dan información sobre el progreso del bucle:</p>
<ul>
<li>forloop.counter siempre se establece en un número entero que representa el número de veces que se ha entrado en el bucle.</li>
<li>forloop.counter0 es como forloop.counter, excepto que es indexado en cero. Su valor será fijado a 0 la primera vez que se entre en el bucle.</li>
<li>forloop.revcounter siempre se establece en un número entero que representa el número de elementos restantes del bucle.</li>
<li>forloop.revcounter0 es como forloop.revcounter, excepto que es indexado en cero.</li>
<li>forloop.first es un valor booleano que se establece a True si esta es la primera iteración del bucle.</li>
<li>forloop.last es un valor booleano que se establece a True si esta es la última iteración del bucle.</li>
<li>forloop.parentloop es una referencia al objeto forloop del bucle padre, en caso de bucles anidados.</li>
</ul>
<p><strong>ifequal / ifnotequal</strong></p>
<p>La etiqueta {% ifequal %} compara dos valores y muestra todo entre {% ifequal %} y {% endifequal %} si los valores son iguales. Este ejemplo compara la plantilla de las variables user y currentuser:</p>
<blockquote><p>
{% ifequal user currentuser %}</p>
<p style="padding-left: 30px;">&lt;h1&gt;Welcome!&lt;/h1&gt;</p>
<p>{% endifequal %}
</p></blockquote>
<p>Al igual que {% if %} la etiqueta {% ifequal %} soporta un {% else %} opcional:</p>
<blockquote><p>
{% ifequal section &#8216;sitenews&#8217; %}</p>
<p style="padding-left: 30px;">&lt;h1&gt;Site News&lt;/h1&gt;</p>
<p>{% else %}</p>
<p style="padding-left: 30px;">&lt;h1&gt;No News Here&lt;/h1&gt;</p>
<p>{% endifequal %}
</p></blockquote>
<p>Sólo las variables de plantilla, cadenas, enteros y números decimales se permiten como argumentos para {% ifequal %}. Estos son ejemplos válidos:</p>
<blockquote><p>{% ifequal variable 1 %}<br />
{% ifequal variable 1.23 %}<br />
{% ifequal variable &#8216;foo&#8217; %}<br />
{% ifequal variable &#8220;foo&#8221; %}</p></blockquote>
<p>Cualquier otro tipo de variables, tales como diccionarios, listas o booleanos no pueden codificarse en la etiqueta {% ifequal %}. Estos son ejemplos inválidos:</p>
<blockquote><p>{% ifequal variable True %}<br />
{% ifequal variable [1, 2, 3] %}<br />
{% ifequal variable {&#8216;key&#8217;: &#8216;value&#8217;} %}</p></blockquote>
<p>Si necesita testear si algo es verdadero o falso, use {% if %} en lugar de {% ifequal %}.</p>
<p><strong>Comentarios</strong></p>
<p>Para designar un comentario usar {# #}.</p>
<p>No pueden usar esta sintaxis para varias líneas. Para ello usar la etiqueta {% comment %}, como esto:</p>
<blockquote><p>{% comment %}<br />
This is a<br />
multiline comment.<br />
{% endcomment %}</p></blockquote>
<p><strong>Filtros</strong></p>
<p>Los filtros de plantilla son formas sencillas de alterar el valor de las variables antes de renderizarlas. Los filtros utilizan un carácter de canalización (pipe), como esto:</p>
<blockquote><p>{{ name|lower }}</p></blockquote>
<p>Los filtros se pueden encadenar, es decir, que pueden ser usados en conjunto de manera que la salida de un filtro se aplica al siguiente. He aquí un ejemplo que convierte el primer elemento de una lista a mayúsculas:</p>
<blockquote><p>{{ my_list|first|upper }}</p></blockquote>
<p>Algunos filtros toman argumentos que vienen después de dos puntos y siempre entre comillas dobles. He aquí un ejemplo:</p>
<blockquote><p>{{ bio|truncatewords:&#8221;30&#8243; }}</p></blockquote>
<p>Esto muestra las primeras 30 palabras de la variable bio.</p>
<p>Los siguientes son algunos de los filtros más importantes:</p>
<ul>
<li>addslashes: Agrega una barra invertida antes de que cualquier barra invertida, comillas simples o comillas dobles. Esto es útil si el texto producido se incluye en una cadena JavaScript.</li>
<li>date: Formatea una cadena de fecha o fecha/hora de acuerdo a un formato dado como parámetro.</li>
<li>length: Devuelve la longitud del valor. Para una lista, devuelve el número de elementos. Para una cadena, devuelve el número de caracteres. Funciona en cualquier objeto Python que sabe cómo determinar su propia longitud, es decir, cualquier objeto que tiene un método __len__()</li>
</ul>
<h3>Filosofías y limitaciones</h3>
<p>Ahora que usted tiene una idea del sistema de plantillas de Django, hay que señalar alguna de sus limitaciones intencionales, junto con algo de filosofía de por qué funciona de la forma en que funciona.</p>
<p>Más que cualquier otro componente de las aplicaciones web, la sintaxis de las plantillas es muy subjetiva, y las opiniones de los programadores varían significativamente.</p>
<p>Con esto en mente, es posible que le interese saber que Django no requiere que usted use su lenguaje de plantillas. Debido a que Django está destinado a ser un completo entorno web que proporcione todas las piezas necesarias para los desarrolladores web para ser productivo, muchas veces es más conveniente el uso del sistema de plantillas de Django que otras librerías de plantillas Python, pero no es un requisito estricto en ningún sentido.</p>
<p>Sin embargo, está claro que tenemos una fuerte preferencia por el lenguaje de plantillas de Django. El sistema de plantillas tiene sus raíces en la forma en que el desarrollo web se hace en el mundo en línea combinado con la experiencia de los creadores de Django. Aquí están algunas de nuestras filosofías:</p>
<ul>
<li>La lógica de negocio deben estar separada de la lógica de presentación. Los desarrolladores de Django ven el sistema de plantillas como una herramienta que controla la presentación y la lógica relacionada con la presentación, y eso es todo.</li>
<li>La sintaxis debe estar desacoplada del HTML/XML. Aunque el sistema de plantillas de Django se utiliza principalmente para producir HTML, su intención es ser tan útil para los formatos no HTML, tales como el texto sin formato.</li>
<li>Los diseñadores se supone que se sienten cómodos con el código HTML. El sistema de plantillas no está diseñado de manera que las plantillas necesariamente se muestran muy bien en los editores WYSIWYG como Dreamweaver. Django espera que los autores de plantillas estén cómodos editando el HTML directamente.</li>
<li>Se asume que los diseñadores no son programadores de Python. Los autores del sistema de plantillas reconocen que a menudo las plantillas de las páginas web son escritas por los diseñadores, no por programadores, y por lo tanto no se debe asumir el conocimiento de Python.</li>
<li>El objetivo no es inventar un lenguaje de programación. El objetivo es ofrecer como mucho la funcionalidad del esquema de programación, tal como la ramificación y la iteración, que es esencial para la toma de decisiones relacionadas con la presentación.</li>
</ul>
<h3>Usando plantillas en vistas</h3>
<p>Recordemos la vista <em>current_datetime</em> en mysite.views. Esto es:</p>
<blockquote><p>from django.http import HttpResponse<br />
import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">html = &#8220;It is now %s.&#8221; % now</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Vamos a cambiar esta vista para utilizar el sistema de plantillas de Django. Al principio se podría pensar en hacer algo como esto:</p>
<blockquote><p>
from django.template import Template, Context<br />
from django.http import HttpResponse<br />
import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">t = Template(&#8220;It is now {{ current_date }}.&#8221;)</p>
<p style="padding-left: 30px;">html = t.render(Context({&#8216;current_date&#8217;: now}))</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Está claro que utiliza el sistema de plantillas, pero no resuelve los problemas que hemos señalado. A saber, la plantilla está incrustada en el código Python, por lo que no se logra una verdadera separación de los datos y la presentación. Vamos a arreglar esto poniendo la plantilla en un archivo separado, que cargará esta vista.</p>
<p>En primer lugar, podría considerar la posibilidad de guardar la plantilla en algún lugar de su sistema de ficheros y usar Python para leer el contenido de la plantilla. Esto es lo que podría parecerse, suponiendo que la plantilla se ha guardado en el archivo /home/djangouser/templates/mytemplate.html:</p>
<blockquote><p>from django.template import Template, Context<br />
from django.http import HttpResponse<br />
import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;"># Simple way of using templates from the filesystem.</p>
<p style="padding-left: 30px;"># This is BAD because it doesn&#8217;t account for missing files!</p>
<p style="padding-left: 30px;">fp = open(&#8216;/home/djangouser/templates/mytemplate.html&#8217;)</p>
<p style="padding-left: 30px;">t = Template(fp.read())</p>
<p style="padding-left: 30px;">fp.close()</p>
<p style="padding-left: 30px;">html = t.render(Context({&#8216;current_date&#8217;: now}))</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Este enfoque, sin embargo, es poco elegante, por estas razones:</p>
<ul>
<li>No maneja el caso de que el archivo falle, como se señala en el código. Si el archivo mytemplate.html no existe o no es legible, la llamada open() lanzará una excepción IOError.</li>
<li>Codifica a pelo la ubicación de la plantilla. Si usted fuera a utilizar esta técnica para cada función de vista, estaría duplicando las localizaciones de la plantilla &#8211; por no mencionar que se trata de escribir mucho.</li>
<li>Incluye una gran cantidad de código repetitivo aburrido. Tienes cosas mejores que hacer que escribir las llamadas a open(), fp.read(), y fp.close() cada vez que se carga una plantilla.</li>
</ul>
<p>Para resolver estos problemas, vamos a utilizar <strong>la carga de plantillas y la herencia de plantillas</strong>.</p>
<h3>Carga de Plantillas</h3>
<p>Django proporciona un API cómodo y eficaz para la carga de plantillas del sistema de archivos, con el objetivo de eliminar la redundancia, tanto en las llamadas de carga de plantillas como en las plantillas en sí mismas.</p>
<p>Para usar esta API de carga de plantillas, primero tendrá que decirle al marco donde se almacenan las plantillas. El lugar para hacerlo es su archivo de configuración <em>settings.py</em> que hemos mencionado en el capítulo anterior, cuando se introdujo la propiedad ROOT_URLCONF.</p>
<p>Abra settings.py y encuentre la propiedad TEMPLATE_DIRS. De forma predeterminada, es una tupla vacía, y es probable que contenga algunos comentarios autogenerados:</p>
<blockquote><p>TEMPLATE_DIRS = (</p>
<p style="padding-left: 30px;"># Put strings here, like &#8220;/home/html/django_templates&#8221;</p>
<p style="padding-left: 30px;"># or &#8220;C:/www/django/templates&#8221;.</p>
<p style="padding-left: 30px;"># Always use forward slashes, even on Windows.</p>
<p style="padding-left: 30px;"># Don&#8217;t forget to use absolute paths, not relative paths.</p>
<p>)</p></blockquote>
<p>Este ajuste le indica al mecanismo de carga de plantillas de Django donde buscar las plantillas. Elija un directorio donde desea almacenar sus plantillas y añadalo a TEMPLATE_DIRS, así:</p>
<blockquote><p>TEMPLATE_DIRS = (</p>
<p style="padding-left: 30px;">&#8216;/home/django/mysite/templates&#8217;,</p>
<p>)
</p></blockquote>
<p>Hay algunas cosas que debe recordar:</p>
<ul>
<li>Usted puede especificar cualquier directorio que desee, siempre y cuando el directorio y las plantillas  dentro de ese directorio sean legibles por la cuenta de usuario en las que el servidor Web se ejecuta. Se recomienda la creación de un directorio de plantillas dentro de su proyecto (es decir, dentro del directorio que ha creado mysite)</li>
<li>Si su TEMPLATE_DIRS sólo contiene un directorio, no se olvide de la coma al final de la cadena del directorio. Python requiere comas dentro de tuplas de un solo elemento para eliminar la ambigüedad de la tupla de una expresión en paréntesis.</li>
<li>Si está en Windows, incluya la letra de la unidad y utilice las barra inclinadas al estilo Unix en lugar de las barras invertidas.</li>
</ul>
<p>Lo más simple es utilizar rutas absolutas (es decir, rutas de directorios que comienzan en la raíz del sistema de archivos). Si quiere ser un poco más flexible, sin embargo, usted puede construir TEMPLATE_DIRS dinámicamente, como en este ejemplo:</p>
<blockquote><p>import os.path</p>
<p>TEMPLATE_DIRS = (</p>
<p style="padding-left: 30px;">os.path.join(os.path.dirname(__file__), &#8216;templates&#8217;).replace(&#8216;\\&#8217;,'/&#8217;),</p>
<p>)</p></blockquote>
<p>Este ejemplo utiliza la variable &#8220;mágica&#8221; de Python __file__, que se ajusta automáticamente al nombre de archivo del módulo de Python en que reside el código. Se pone el nombre del directorio que contiene a settings.py (os.path.dirname), y se une con las plantillas de una manera (os.path.join), y entonces asegura que todo lo que se utiliza sean barras inclinadas en lugar de barras invertidas (en el caso de Windows).</p>
<p>Con TEMPLATE_DIRS activo, el siguiente paso es cambiar el código para el uso de la funcionalidad de la carga de plantillas de Django en lugar de codificar a pelo las rutas de las plantillas. Volviendo a nuestra vista current_datetime, vamos a cambiarla de esta manera:</p>
<p>from django.template.loader import get_template</p>
<blockquote><p>
from django.template import Context<br />
from django.http import HttpResponse<br />
import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">t = get_template(&#8216;current_datetime.html&#8217;)</p>
<p style="padding-left: 30px;">html = t.render(Context({&#8216;current_date&#8217;: now}))</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>La función get_template() toma un nombre de plantilla como argumento, busca dónde la plantilla residee en el sistema de archivos, abre ese archivo, y devuelve un objeto Template compilado.</p>
<p>Si get_template() no puede encontrar la plantilla con el nombre que se le da, lanza una excepción <em>TemplateDoesNotExist</em>.</p>
<p>Ahora, crear el archivo current_datetime.html dentro de su directorio de plantillas mediante el siguiente código de plantilla:</p>
<blockquote><p>It is now {{ current_date }}.</p></blockquote>
<p>Actualice la página en el explorador Web, y usted debería ver la página completamente renderizada.</p>
<h3>render_to_response()</h3>
<p>Hemos mostrado cómo cargar una plantilla, rellenar un contexto, y devolver un objeto HttpResponse con el resultado de la plantilla renderizada. Lo hemos optimizado mediante el uso de get_template() en lugar de la codificación a pelo de las plantillas y las rutas de plantillas. Sin embargo, todavía se requiere una buena cantidad de código para escribir todas esas cosas. Debido a que estos pasos son iguales, Django proporciona una <strong>abreviatura que le permite cargar una plantilla, renderizarla, y devolver un HttpResponse, todo en una sola línea de código</strong>.</p>
<p>Esta abreviatura es una función llamada <em>render_to_response()</em>, que reside en el módulo django.shortcuts.<br />
Aquí está el ejemplo current_datetime reescrito para utilizar render_to_response():</p>
<blockquote><p>
from django.shortcuts import render_to_response<br />
import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">return render_to_response(&#8216;current_datetime.html&#8217;, {&#8216;current_date&#8217;: now})</p>
</blockquote>
<p>El primer argumento de render_to_response() es el nombre de la plantilla a usar. El segundo argumento, si lo hay, debe ser un diccionario para usar en la creación de un contexto para la plantilla. Si usted no proporciona un segundo argumento, render_to_response() utiliza un diccionario vacío.</p>
<h3>locals()</h3>
<p>Muchas veces, usted se encontrará que usted mismo cálcula algunos valores, los almacena en variables (por ejemplo, <em>now</em> en el código anterior), y envía esas variables a la plantilla. Esto es un poco redundante y también significa escribir más.</p>
<p>Usted puede usar la función Python llamada <em>locals()</em>. Esta <strong>devuelve un diccionario que asigna todos los nombres de variables locales a sus valores</strong>, donde local significa todas las variables que han sido definidas en el ámbito local. Así, la vista anterior podría reescribirse así:</p>
<blockquote><p>def current_datetime(request):</p>
<p style="padding-left: 30px;">current_date = datetime.datetime.now()</p>
<p style="padding-left: 30px;">return render_to_response(&#8216;current_datetime.html&#8217;, locals())</p>
</blockquote>
<p>Hemos cambiado el nombre de la variable a current_date ahora, ya que ese es el nombre de variable que la plantilla espera.</p>
<h3>Subdirectorios en get_template()</h3>
<p>Puede ser difícil de manejar el almacenar todas sus plantillas en un solo directorio. Usted podría almacenar plantillas en subdirectorios de su directorio de plantillas, y eso está bien. De hecho, le recomendamos hacerlo; algunas características más avanzadas de Django (como el sistema de vistas genéricas) esperan esta disposición de plantillas por defecto.</p>
<blockquote><p>t = get_template(&#8216;dateapp/current_datetime.html&#8217;)</p></blockquote>
<p>Ya que render_to_response() es una pequeña envoltura alrededor de get_template(), usted puede hacer lo mismo con el primer argumento de render_to_response(), así:</p>
<blockquote><p>return render_to_response(&#8216;dateapp/current_datetime.html&#8217;, {&#8216;current_date&#8217;: now})</p></blockquote>
<h3>La etiqueta de plantilla include</h3>
<p>Podemos introducir una etiqueta de plantilla integrada: {% include%}. Esta etiqueta permite incluir el contenido de otra plantilla. El argumento de la etiqueta debe ser el nombre de la plantilla a incluir, y el nombre de la plantilla puede ser una variable o una cadena entre comillas simples o dobles. Cada vez que tenga el mismo código en varias plantillas, considere el uso de {% include %} para eliminar la redundancia.</p>
<p>Estos dos ejemplos incluyen el contenido de la plantilla nav.html. Los ejemplos son equivalentes e ilustran bien el uso de las comillas simples o dobles:</p>
<blockquote><p>{% include &#8216;nav.html&#8217; %}<br />
{% include &#8220;nav.html&#8221; %}</p></blockquote>
<p>El siguiente ejemplo incluye el contenido de la plantilla, cuyo nombre figura en la variable template_name:</p>
<blockquote><p>{% include template_name %}</p></blockquote>
<p>Al igual que en get_template(), el nombre del fichero de la plantilla se determina mediante la adición al directorio de plantillas de TEMPLATE_DIRS para el nombre de la plantilla.</p>
<p>La plantillas incluidas son evaluadas dentro del contexto de la plantilla que las incluye. Por ejemplo, considere estas dos plantillas:</p>
<blockquote><p># mypage.html</p>
<p>{% include &#8220;includes/nav.html&#8221; %}</p>
<p style="padding-left: 30px;">&lt;h1&gt;{{ title }}&lt;/h1&gt;</p>
</blockquote>
<blockquote><p># includes/nav.html<br />
&lt;div id=&#8221;nav&#8221;&gt;You are in: {{ current_section }}&lt;/div&gt;</p></blockquote>
<p>Si renderiza mypage.html con un contexto que contiene current_section, entonces la variable estará disponible en la plantilla incluida, como era de esperar.</p>
<p>Si, en una etiqueta {% include %}, no se encuentra una plantilla con el nombre dado, Django hará una de estas 2 cosas:</p>
<ul>
<li>Si DEBUG es True, verá una excepción TemplateDoesNotExist en una página de error de Django.</li>
<li>Si DEBUG es False, la etiqueta fallará de forma silenciosa, no visualizando nada en el lugar de la etiqueta.</li>
</ul>
<h3>Herencia de plantillas</h3>
<p>Nuestros ejemplos de plantillas hasta ahora han sido pequeños fragmentos de código HTML, pero en el mundo real usted utilizará el sistema de plantillas de Django para crear páginas enteras de HTML. Esto lleva a un problema de desarrollo web común: a través de un sitio Web, ¿cómo se puede reducir la duplicación y la redundancia de áreas de página comunes, tales como la navegación de todo el sitio?</p>
<p>Una forma clásica de resolver este problema es usar includes de lado servidor, las directivas que usted puede incrustar dentro de sus páginas HTML para incluir una página web dentro de otra. De hecho, Django soporta esta aproximación con la etiqueta {% include %} que acabamos de describir. Pero la forma preferida de resolver este problema con Django es utilizar una estrategia más elegante llamado herencia de plantillas.</p>
<p>En esencia, la herencia de plantillas <strong>le permite construir una plantilla &#8220;esqueleto&#8221; base que contiene todas las partes comunes de su sitio y define &#8220;bloques&#8221; que las plantillas hijas puede rellenar</strong>.</p>
<p>Veamos un ejemplo de esto creando una plantilla más completa para nuestra vista <em>current_datetime</em>, editando el archivo current_datetime.html:</p>
<blockquote><p>
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01//EN&#8221;&gt;<br />
&lt;html lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;</p>
<p style="padding-left: 30px;">&lt;title&gt;The current time&lt;/title&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;</p>
<p style="padding-left: 30px;">&lt;h1&gt;My helpful timestamp site&lt;/h1&gt;</p>
<p style="padding-left: 30px;">It is now {{ current_date }}.</p>
<p style="padding-left: 30px;">&lt;hr&gt;Thanks for visiting my site.</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;
</p></blockquote>
<p>Eso se ve muy bien, pero ¿qué sucede cuando queremos crear una plantilla para otra vista &#8211; por ejemplo, la vista hours_ahead? Si queremos volver a hacer otra plantilla HTML agradable, válida, completa, nos quedará algo como esto:</p>
<blockquote><p>
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01//EN&#8221;&gt;<br />
&lt;html lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;</p>
<p style="padding-left: 30px;">&lt;title&gt;Future time&lt;/title&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;</p>
<p style="padding-left: 30px;">&lt;h1&gt;My helpful timestamp site&lt;/h1&gt;</p>
<p style="padding-left: 30px;">In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
<p style="padding-left: 30px;">&lt;hr&gt;Thanks for visiting my site.</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;
</p></blockquote>
<p>Es evidente que hay mucho HTML duplicado. Imagínese si tuviéramos un sitio más típico, incluyendo una barra de navegación, una hojas de estilo, tal vez algo de JavaScript – empezaremos metiendo todo ese HTML redundante en cada plantilla.</p>
<p>La solución de include de lado servidor a este problema es factorizar las partes comunes de ambas plantillas y guardarlos en distintos fragmentos de plantilla, que luego son incluidos en cada plantilla. Tal vez desee guardar la parte superior de la plantilla en un archivo llamado <em>header.html</em>:</p>
<blockquote><p>
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01//EN&#8221;&gt;<br />
&lt;html lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;
</p></blockquote>
<p>y quizá almacenar la parte inferior en un fichero llamado <em>footer.html</em>:</p>
<blockquote><p>
&lt;hr&gt;</p>
<p style="padding-left: 30px;">&lt;p&gt;Thanks for visiting my site.&lt;/p&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;
</p></blockquote>
<p>Con una estrategia basada en include, los encabezados y los pies de página son fáciles. Es el punto medio el desordenado. En este ejemplo, ambas páginas tienen un título -&lt;h1&gt;My helpful timestamp site &lt;/h1&gt; pero ese título no puede encajar en header.html porque el &lt;title&gt; en ambas páginas es diferente. Si incluimos el &lt;h1&gt; en la cabecera, tendríamos que incluir el &lt;title&gt;, que no nos permitiría personalizarlo por página.</p>
<p>El sistema de herencia de plantillas de Django soluciona estos problemas. Puede pensar en ello como una versión dentro-fuera de los includes de lado servidor. En lugar de definir los fragmentos de código que son comunes, se definen los fragmentos de código que son diferentes.</p>
<p>El primer paso es definir una plantilla base, un esqueleto de la página que las plantillas hijas rellenarán después. Aquí hay una plantilla base para nuestro ejemplo en curso: </p>
<blockquote><p>
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01//EN&#8221;&gt;<br />
&lt;html lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;</p>
<p style="padding-left: 30px;">&lt;title&gt;{% block title %}{% endblock %}&lt;/title&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;</p>
<p style="padding-left: 30px;">&lt;h1&gt;My helpful timestamp site&lt;/h1&gt;</p>
<p style="padding-left: 30px;">{% block content %}{% endblock %}</p>
<p style="padding-left: 30px;">{% block footer %}</p>
<p style="padding-left: 30px;">&lt;hr&gt;</p>
<p style="padding-left: 30px;">&lt;p&gt;Thanks for visiting my site.&lt;/p&gt;</p>
<p style="padding-left: 30px;">{% endblock %}</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;
</p></blockquote>
<p>Esta plantilla, que llamaremos <em>base.html</em>, define un documento de esqueleto HTML sencillo que se utilizará para todas las páginas del sitio. Es el trabajo de las plantillas hijas reemplazar, añadir o dejar vacío el contenido de los bloques.</p>
<p>Estamos utilizando una etiqueta de plantilla que no hemos visto antes: la etiqueta {% block %}. Todo lo que hace una etiqueta {% block %} es decirle al motor de plantillas que una plantilla hija puede sustituir aquellas partes de la plantilla.</p>
<p>Ahora que tenemos esta plantilla base, podemos modificar nuestra plantilla <em>current_datetime.htm</em>l existente:</p>
<blockquote><p>{% extends &#8220;base.html&#8221; %}</p>
<p>{% block title %}The current time{% endblock %}</p>
<p>{% block content %}</p>
<p>&lt;p&gt;It is now {{ current_date }}.&lt;/p&gt;</p>
<p>{% endblock %}
</p></blockquote>
<p>Vamos a crear una plantilla para la vista <em>hours_ahead</em> del Capítulo 3. Se podría parecer a esto:</p>
<blockquote><p>
{% extends &#8220;base.html&#8221; %}</p>
<p>{% block title %}Future time{% endblock %}</p>
<p>{% block content %}</p>
<p>&lt;p&gt;In {{ hour_offset }} hour(s), it will be {{ next_time }}.&lt;/p&gt;</p>
<p>{% endblock %}
</p></blockquote>
<p>¿No es esto bonito? Cada plantilla contiene sólo el código que es único para esa plantilla. No hay redundancia. Si usted necesita hacer un cambio de diseño de todo el sitio, sólo haga el cambio a <em>base.html</em>, y todas las otras plantillas inmediatamente reflejarán el cambio.</p>
<p>He aquí cómo funciona. Cuando se carga la plantilla <em>current_datetime.html</em>, el motor de plantillas ve la etiqueta {% extends %}, notando que esa plantilla es una plantilla hija. El motor carga inmediatamente la plantilla padre &#8211; en este caso, <em>base.html</em>.</p>
<p>En ese momento, el motor de plantillas nota las tres etiquetas {% block %} de base.html y sustituye esos bloques con el contenido de la plantilla hija.</p>
<p>La herencia no afecta al contexto de la plantilla. En otras palabras, cualquier plantilla en el árbol de herencia tendrá acceso a cada una de sus variables de plantilla en el contexto.</p>
<p>Puede utilizar tantos niveles de herencia, según sea necesario. Una forma común de utilizar la herencia es el siguiente enfoque de tres niveles:</p>
<ol>
<li>Crear una plantilla base.html que contenga el diseño principal de su sitio. Esta contiene las cosas que rara vez o nunca se cambian.</li>
<li>Crear una plantilla base_SECTION.html por cada sección del sitio (por ejemplo, base_photos.html y base_forum.html). Estas plantillas extienden a base.html e incluyen estilos y diseño específicos de la sección.</li>
<li>Crear plantillas individuales para cada tipo de página, como una página del foro o una galería de fotos. Estas plantillas extienden a la plantilla de la sección correspondiente.</li>
</ol>
<p>Este método maximiza la reutilización de código y facilita el añadir elementos a las zonas comunes, como la sección de navegación.</p>
<p>Aquí hay algunas pautas para trabajar con herencia de plantillas:</p>
<ul>
<li>Si usted usa {% extends %} en una plantilla, debe ser la primera etiqueta de esa plantilla.</li>
<li>Generalmente, cuanto más etiquetas {% block %} en sus plantillas base, mejor. Recordar que las plantillas hijas no tienen que definir todos los bloques de los padres, así que usted puede definir en las plantillas hijas sólo los que necesita.</li>
<li>Si usted encuentra duplicación de código en varias plantillas, probablemente significa que usted debe mover el código a una etiqueta {% block %} de una plantilla padre.</li>
<li>Si usted necesita obtener el contenido del bloque de la plantilla padre, use {{ block.super }}, que es una variable &#8220;mágica&#8221; que proporciona el texto renderizado de la plantilla padre. Esto es útil si desea añadir el contenido de un bloque padre en lugar de sobreescribirlo completamente.</li>
<li>Usted no puede definir múltiples etiquetas {% block %} con el mismo nombre en la misma plantilla.<br />
Esta limitación existe porque una etiqueta de bloque funciona en ambas direcciones. Es decir, un etiqueta de bloque no sólo proporcionan un contenedor para rellenar, sino que también define el contenido que rellena el contenedor en el padre. Si hubiese dos etiquetas {% block %} llamadas iguales en una plantilla, el padre no sabría cual de los contenidos de bloque utilizar.</li>
<li>El nombre de plantilla que se pasa a {% extends %} se carga utilizando el mismo método que usa get_template(). Es decir, el nombre de la plantilla se añade a la propiedad TEMPLATE_DIRS.</li>
<li>En la mayoría de los casos, el argumento de {% extends %} será una cadena, pero puede ser una variable, si usted no sabe el nombre de la plantilla padre hasta tiempo de ejecución. Esto le permite hacer algunas cosas de forma dinámica.</li>
</ul>
<h3>Enlaces Relacionados:</h3>
<ul>
<li><a href="http://www.cibernatural.com/tutorial-de-django-i">Tutorial de Django I</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-ii">Tutorial de Django II</a></li>
<li>Tutorial de Django III</li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-iv">Tutorial de Django IV</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-v">Tutorial de Django V</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vi">Tutorial de Django VI</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vii">Tutorial de Django VII</a></li>
</ul>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=509">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/tutorial-de-django-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web corporativa C2 Construcción en Lanzarote</title>
		<link>http://www.cibernatural.com/web-corporativa-c2-construccion-en-lanzarote/</link>
		<comments>http://www.cibernatural.com/web-corporativa-c2-construccion-en-lanzarote/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 16:58:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Construcción]]></category>
		<category><![CDATA[Inmobiliaria]]></category>
		<category><![CDATA[Lanzarote]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=475</guid>
		<description><![CDATA[Cibernatural S.L. estrena la web de la División Construcción del grupo C2 en Lanzarote &#8211; Canarias. http://www.c2construccion.com El grupo C2 estrena nueva web corporativa para su división de CONSTRUCCIÓN en la isla de Lanzarote, destacando los servicios que ofrecen para la gestión integral de sus proyectos, así como de la aplicaciones más avanzadas de sistemas [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cibernatural.com">Cibernatural S.L.</a> estrena la web de la División Construcción del grupo C2 en Lanzarote &#8211; Canarias.</p>
<p><a href="http://www.c2construccion.com">http://www.c2construccion.com</a></p>
<p>El grupo C2 estrena nueva web corporativa para su división de <strong>CONSTRUCCIÓN en la isla de Lanzarote</strong>, destacando los servicios que ofrecen para la gestión integral de sus proyectos, así como de la aplicaciones más avanzadas de sistemas constructivos y de seguridad en la construcción.</p>
<h3>Páginas relacionadas</h3>
<ul>
<li><a href="http://www.c2gestioninmobiliaria.com/">C2 Gestión Inmobiliaria en Lanzarote</a></li>
<li><a href="http://www.facebook.com/pages/EQUO-6-ARQUITECTURA-FORMA-LUZ-Y-COLOR/114839815923">Equo6 &#8211; Estudio de Arquitectura en Lanzarote</a></li>
<li><a href="http://www.excellentlanzarote.com/">Excellent Lanzarote</a></li>
<li><a href="http://www.c2mantenimiento.com/">C2 Mantenimiento</a></li>
<li><a href="http://www.grenwich-lanzarote.com/">Grenwich Lanzarote &#8211; Apartamentos en Playa Blanca</a></li>
</ul>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=475">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/web-corporativa-c2-construccion-en-lanzarote/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial de Django &#8211; II</title>
		<link>http://www.cibernatural.com/tutorial-de-django-ii/</link>
		<comments>http://www.cibernatural.com/tutorial-de-django-ii/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 12:17:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=453</guid>
		<description><![CDATA[Vistas y URLconfs Su primera Página Django: Hola Mundo Como primer objetivo, vamos a crear una página Web que produzca el mensaje de ejemplo famoso: &#8220;Hola mundo&#8221;. Con Django, el contenido de la página es producido por una vista, y la dirección se especifica en una URLconf.  En primer lugar, vamos a escribir la función [...]]]></description>
			<content:encoded><![CDATA[<h2><strong><span style="text-decoration: underline;">Vistas y URLconfs</span></strong></h2>
<p><br/><br/><br/></p>
<h3>Su primera Página Django: Hola Mundo</h3>
<p>Como primer objetivo, vamos a crear una página Web que produzca el mensaje de ejemplo famoso: &#8220;Hola mundo&#8221;.</p>
<p>Con Django, el contenido de la página es producido por una vista, y la dirección se especifica en una URLconf.  En primer lugar, vamos a escribir la función de la vista &#8220;Hola Mundo&#8221;.</p>
<p>Una vista &#8220;Hola Mundo&#8221; es simple. Aquí está toda la función que debe escribir en el archivo <em>views.py</em>:</p>
<blockquote><p>from django.http import HttpResponse</p>
<p>def hello(request):</p>
<p style="padding-left: 30px;">return HttpResponse(&#8220;Hello world&#8221;)</p>
</blockquote>
<p>Una vista en Python es sólo una función que toma un <em>HttpRequest </em>como su primer parámetro y devuelve una instancia de <em>HttpResponse</em>. Para que una función de Python sea una vista Django, tiene que hacer esas dos cosas. (Hay excepciones, pero las veremos más tarde.)  Si en este momento ejecuta <em>python manage.py runserver</em> de nuevo, seguirás viendo el mensaje &#8220;Bienvenido a Django&#8221;, sin ningún rastro de &#8220;Hola mundo&#8221;.  Eso se debe a que el proyecto mysite no conoce la vista hello; se necesita ahora decirle a Django explícitamente que se va a activar esa vista en una determinada URL, usando URLconf.  Un URLconf es como una tabla de contenidos para un sitio web Django. Básicamente, es un mapeo entre las URL y las funciones de vista que deben llamarse para esas direcciones URL.  El URLconf por defecto incluye algunas características comentadas de uso común en Django, por lo que la activación de esas características es tan fácil como descomentar las líneas adecuadas. Si se ignora el código comentado, aquí está la esencia de un URLconf:</p>
<blockquote><p>from django.conf.urls.defaults import *</p>
<p>urlpatterns = patterns(&#8221;,</p>
<p>)</p></blockquote>
<p>Lo más importante a destacar es la variable urlpatterns, que Django espera encontrarla en el módulo URLconf. Esta variable define la asignación entre las direcciones URL y el código que controla las direcciones URL. Por defecto, el URLconf está vacío &#8211; la aplicación Django está en blanco.  Para agregar una URL y una vista al URLconf, simplemente añadir una tupla Python que asigna un patrón de URL a la función de la vista. He aquí cómo conectarlo en la vista hello:</p>
<blockquote><p>from django.conf.urls.defaults import *</p>
<p>from mysite.views import hello</p>
<p style="padding-left: 30px;">urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(&#8216;^hello/$&#8217;, hello),</p>
<p>)</p></blockquote>
<p>En pocas palabras, se le dice a Django que cualquier petición a la URL /hello/ debería ser gestionada por la función de vista hello.</p>
<p>Para probar los cambios a la URLconf, inicie el servidor de desarrollo de Django con el comando python manage.py runserver. (Si usted lo dejó ejecutándose también está bien. El servidor de desarrollo detecta automáticamente los cambios en su código Python y vuelve a cargarlos cuando sea necesario, para que no tenga que reiniciar el servidor entre los cambios.) El servidor se está ejecutando en la dirección http://127.0.0.1:8000/, por lo que abra un navegador Web y vaya a http://127.0.0.1:8000/hello/. Usted debe ver el texto &#8220;Hola mundo&#8221;, la salida de su vista Django. Usted hizo su primera página web en Django.</p>
<h3>Una nota rápida sobre errores 404</h3>
<p>En este punto, el URLconf define sólo un único patrón de URL: el que trata las solicitudes de la dirección /hello/. ¿Qué sucede cuando usted solicita una dirección URL diferente?</p>
<p>Usted debe ver un mensaje de &#8220;Página no encontrada&#8221;. Django muestra este mensaje porque ha solicitado una URL que no está definida en su URLconf.</p>
<p>La utilidad de esta página va más allá del mensaje básico de error 404. También le dice, de forma precisa que URLconf Django es usada y cada patrón utilizado en el URLconf. De esa información, usted debe ser capaz de determinar por qué la dirección URL solicitada arrojó un error 404.</p>
<p>Naturalmente, esta información es confidencial y está destinada únicamente a usted, el desarrollador Web. Si esto fuese un sitio de desplegado en Internet, usted no desearía exponer esa información al público. Por esta razón, esta página &#8220;Página no encontrada&#8221;, se muestra sólo si su Proyecto de Django se encuentra en modo de depuración. Le explicaremos cómo desactivar el modo de depuración más tarde. Por ahora, sólo sepa que cada proyecto Django creado se encuentra en modo de depuración, y si el proyecto no está en modo de depuración, Django emite una respuesta 404 diferente.</p>
<h3>Una nota rápida sobre la raíz del sitio</h3>
<p>Como se explicó en la última sección, verá un mensaje de error 404 si usted va a la raíz del sitio: http://127.0.0.1:8000/. El patrón URL para que coincida con la raíz del sitio es un poco contradictorio, por lo que es digno de mención. Cuando esté listo para poner en práctica una vista de la raíz del sitio, utilice el patrón de URL &#8216;^$&#8217;, que coincide con una cadena vacía. He aquí un ejemplo:</p>
<blockquote><p>from mysite.views import hello, my_homepage_view</p>
<p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(&#8216;^$&#8217;, my_homepage_view),</p>
<p style="padding-left: 30px;"># &#8230;</p>
<p>)</p></blockquote>
<p>Cómo Django procesa una petición:</p>
<ol>
<li>Una petición viene a /hello/.</li>
<li>Django determina el URLconf raíz en base a ROOT_URLCONF.</li>
<li>Django busca en todos los urlpatterns del URLconf por el primero que coincida con /hello/.</li>
<li>Si encuentra una coincidencia, llama a la función de vista asociada.</li>
<li>La función de vista devuelve un HttpResponse.</li>
<li>Django convierte el HttpResponse en la respuesta HTTP apropiada, que resulta en una página web.</li>
</ol>
<p>Ahora que conoce los aspectos básicos de cómo hacer páginas Django. Es muy sencillo, en realidad: sólo escribir funciones de vista y mapearlas a URLs a través de URLconfs.</p>
<h3>Segunda vista: contenido dinámico</h3>
<p>Vamos a crear algo más dinámico: una página Web que muestre la fecha y hora actuales. Este es un paso agradable y simple, porque no se trata de una base de datos o cualquier entrada de usuario, sólo la salida del reloj interno del servidor. Es sólo un poco más emocionante que &#8220;Hola mundo&#8221;, pero se muestran un par de conceptos nuevos.</p>
<p>Para realizar una vista Django que muestre la fecha y hora actuales, sólo es necesario colocar la sentencia  datetime.datetime.now() en una vista y devolver un <em>HttpResponse</em>.</p>
<blockquote><p>from django.http import HttpResponse</p>
<p>import datetime</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">html = &#8220;It is now %s.&#8221; % now</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Al igual que con la función de vista hello, esta debe residir en <em>views.py</em>.  Este es el aspecto completo de <em>views.py</em>:</p>
<blockquote><p>from django.http import HttpResponse</p>
<p>import datetime</p>
<p>def hello(request):</p>
<p style="padding-left: 30px;">return HttpResponse(&#8220;Hello world&#8221;)</p>
<p>def current_datetime(request):</p>
<p style="padding-left: 30px;">now = datetime.datetime.now()</p>
<p style="padding-left: 30px;">html = &#8220;It is now %s.&#8221; % now</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Después de añadir esto a <em>views.py</em>, agreguar el patrón URL a urls.py para decirle a Django que URL debe manejar esta vista. Algo como /time/ tendría sentido:</p>
<blockquote><p>from django.conf.urls.defaults import *</p>
<p>from mysite.views import hello, current_datetime</p>
<p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(&#8216;^hello/$&#8217;, hello),</p>
<p style="padding-left: 30px;">(&#8216;^time/$&#8217;, current_datetime),</p>
<p>)</p></blockquote>
<p>Con la vista escrita y la URLconf actualizada, arrancar el runserver y visitar  http://127.0.0.1:8000/time/ en el navegador. Usted debería ver la fecha y hora actuales.</p>
<h3>URLconfs y acoplamiento débil</h3>
<p>Ahora es un buen momento para destacar una filosofía clave detrás de URLconfs y detrás de Django en general: el principio de acoplamiento débil.  Si dos trozos de código están débilmente acoplados, los cambios realizados a uno de ellos tendrá poco o ningún efecto en el otro.</p>
<p>Las URLconfs de Django son un buen ejemplo de este principio en la práctica. En una aplicación Web Django, las definiciones de URL y las funciones de vista que ellas llaman están débilmente acopladas, es decir, la decisión de lo que la URL debe ser para una determinada función y la implementación de la función residen en dos lugares diferentes. Esto le permite intercambiar una pieza sin afectar a la otra.</p>
<p>Por ejemplo, considere la vista del current_datetime. Si usted quiere cambiar la dirección por ejemplo, para moverla de /time/ a /current-time/ podría hacer un cambio rápido en URLconf sin tener que preocuparse por la vista. Del mismo modo, si usted quisiera cambiar la función de vista que altera la lógica de alguna manera, podría hacerlo sin afectar a la URL a la que está vinculada la función.</p>
<p>Además, si usted quiere exponer a la actual funcionalidad de la fecha en varias URL, usted fácilmente podría hacerlo editando URLconf, sin tener que tocar el código de la vista. En este ejemplo, el current_datetime está disponible en dos URLs. Es un ejemplo artificial, pero esta técnica puede ser útil:</p>
<blockquote><p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(&#8216;^hello/$&#8217;, hello),</p>
<p style="padding-left: 30px;">(&#8216;^time/$&#8217;, current_datetime),</p>
<p style="padding-left: 30px;">(&#8216;^another-time-page/$&#8217;, current_datetime),</p>
<p>)</p></blockquote>
<p>Las URLconfs y las vistas están débilmente acopladas en la acción.</p>
<h3>Tercera vista: URLs dinámicas</h3>
<p>En la vista current_datetime, el contenido de la página, la fecha/hora actual, es dinámica, pero la dirección (/time/) es estática. En la mayoría de aplicaciones Web dinámicas, sin embargo, una dirección URL contiene los parámetros que influyen en la salida de la página. Por ejemplo, una librería on-line podría dar a cada libro su propia URL.</p>
<p>Crearemos una tercera vista que muestre la fecha y hora actuales compensada por un cierto número de horas. El objetivo es diseñar un sitio para que la página /time/plus/1/ muestre la fecha y hora dentro de una hora, la página /time/plus/2/ muestra la fecha y hora dentro de dos horas, la página /time/plus/3/ muestre la fecha y hora dentrop de tres horas, y así sucesivamente.</p>
<p>Un principiante podría pensar en codificar una función de vista distinta para cada desplazamiento de hora, que podría dar lugar a una URLconf como:</p>
<blockquote><p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(&#8216;^time/$&#8217;, current_datetime),</p>
<p style="padding-left: 30px;">(&#8216;^time/plus/1/$&#8217;, one_hour_ahead),</p>
<p style="padding-left: 30px;">(&#8216;^time/plus/2/$&#8217;, two_hours_ahead),</p>
<p style="padding-left: 30px;">(&#8216;^time/plus/3/$&#8217;, three_hours_ahead),</p>
<p style="padding-left: 30px;">(&#8216;^time/plus/4/$&#8217;, four_hours_ahead),</p>
<p>)</p></blockquote>
<p>Entonces, ¿cómo diseñar la aplicación para manejar los desplazamiento de hora arbitrarios? La clave es usar comodines de patrones URL. Como se mencionó anteriormente, un patrón URL es una expresión regular, por lo que puede utilizar el patrón de expresión regular \d+ para que coincida con uno o más dígitos:</p>
<blockquote><p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;"># &#8230; 	(r&#8217;^time/plus/\d+/$&#8217;, hours_ahead),</p>
<p style="padding-left: 30px;"># &#8230;</p>
<p>)</p></blockquote>
<p>Este nuevo patrón URL casará con cualquier URL como /time/plus/2/, /time/plus/25/, o incluso /time/plus/100000000000/.<br />
Ahora, vamos a limitarlo de forma que se permita un desplazamiento máximo de 99 horas. Esto significa que queremos permitir, números de uno o de dos dígitos, y en la sintaxis de la expresión regular, que se traduce en \d(1,2):</p>
<blockquote><p>(r&#8217;^time/plus/\d{1,2}/$&#8217;, hours_ahead),</p></blockquote>
<p>Un detalle importante que se introduce aquí es el carácter r al principio de la expresión regular. Este caracter le dice a Python que la cadena es una &#8220;raw string&#8221; &#8211; su contenido no debe interpretar barras invertidas. En las cadenas normales de Python, las barras invertidas son usadas para caracteres de escape especiales, como la cadena &#8216;\n&#8217;, que es una cadena de caracteres que contiene una nueva línea.</p>
<p>Cuando se agrega el r para que sea una raw string, Python, no aplica el escape de la barra invertida, por lo que r&#8217;\n&#8217; es una cadena de dos caracteres que contiene una barra invertida literal y la n minúscula. Se recomienda fuertemente que utilice raw string en cualquier momento si está definiendo una expresión regular en Python. A partir de ahora, todos los urlpatterns en este libro serán raw string.</p>
<p>Ahora que se ha designado un comodín para la dirección, usted necesita una manera de pasar esos datos de  comodín a la función de vista, de modo que usted pueda utilizar una función de vista única para cualquier desplazamiento de hora arbitrario. Usted puede hacer esto colocando entre paréntesis los datos de la URLpattern que desea guardar. En el caso del ejemplo, lo que desea guardar es cualquier número que se introduzca en la URL, así que ponga paréntesis alrededor de \d(1,2), de esta manera:</p>
<blockquote><p>(r&#8217;^time/plus/(\d{1,2})/$&#8217;, hours_ahead),</p></blockquote>
<p>Usted está utilizando paréntesis para capturar datos del texto concordante. El URLconf final, incluidos los últimos dos puntos de vista, se parece a esto:</p>
<blockquote><p>from django.conf.urls.defaults import *</p>
<p>from mysite.views import hello, current_datetime, hours_ahead</p>
<p>urlpatterns = patterns(&#8221;,</p>
<p style="padding-left: 30px;">(r&#8217;^hello/$&#8217;, hello),</p>
<p style="padding-left: 30px;">(r&#8217;^time/$&#8217;, current_datetime),</p>
<p style="padding-left: 30px;">(r&#8217;^time/plus/(\d{1,2})/$&#8217;, hours_ahead),</p>
<p>)</p></blockquote>
<p>hours_ahead es muy similar a la vista current_datetime escrita antes, con una diferencia clave: que lleva un argumento extra que el número de horas de desplazamiento. Aquí está la vista de código:</p>
<blockquote><p>from django.http import Http404, HttpResponse</p>
<p>import datetime</p>
<p>def hours_ahead(request, offset):</p>
<p style="padding-left: 30px;">try:</p>
<p style="padding-left: 60px;">offset = int(offset)</p>
<p style="padding-left: 30px;">except ValueError:</p>
<p style="padding-left: 60px;">raise Http404()</p>
<p style="padding-left: 30px;">dt = datetime.datetime.now() + datetime.timedelta(hours=offset)</p>
<p style="padding-left: 30px;">html = &#8220;In %s hour(s), it will be %s.&#8221; % (offset, dt)</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Con esta función de vista y el URLconf escrito, iniciar el servidor de desarrollo de Django (si no está ya en ejecución), y visitar http://127.0.0.1:8000/time/plus/3/ para verificar que funciona. A continuación, intentar http://127.0.0.1:8000/time/plus/5/. Luego http://127.0.0.1:8000/time/plus/24/. Por último, visitar http://127.0.0.1:8000/time/plus/100/ para comprobar que el patrón en el URLconf acepta números sólo de uno o dos dígitos; Django debería mostrar un error de &#8220;Página no encontrada&#8221; en este caso, tal y como vimos. La URL http://127.0.0.1:8000/time/plus/ (sin horas) también debería lanzar un error 404.</p>
<h3>Páginas de error bonitas en Python</h3>
<p>Vamos a introducir deliberadamente un error de Python comentando en el archivo views.py las líneas offset=int(offset)  en la vista de hours_ahead:</p>
<blockquote><p>def hours_ahead(request, offset):</p>
<p style="padding-left: 30px;"># try:</p>
<p style="padding-left: 30px;"># 	offset = int(offset)</p>
<p style="padding-left: 30px;"># except ValueError:</p>
<p style="padding-left: 30px;"># 	raise Http404()</p>
<p style="padding-left: 30px;">dt = datetime.datetime.now() + datetime.timedelta(hours=offset)</p>
<p style="padding-left: 30px;">html = &#8220;In %s hour(s), it will be %s.&#8221; % (offset, dt)</p>
<p style="padding-left: 30px;">return HttpResponse(html)</p>
</blockquote>
<p>Inicie el servidor de desarrollo y vaya a /time/plus/3/. Usted verá una página de error con mucha información, incluido un mensaje TypeError que aparece en la parte superior: &#8220;unsupported type for timedelta hours component: unicode&#8221;</p>
<p>¿Qué pasó? Pues bien, la función de datetime.timedelta espera que el parámetro de horas que se le pase sea un número entero, y el trozo de código que convierte el desplazamiento a un número entero fue comentado. Eso provoca que datetime.timedelta lance un TypeError. Es el típico pequeño fallo que todos los programadores han cometido en algún momento.</p>
<p>El objetivo de este ejemplo es mostrar las páginas de error de Django. Tómese su tiempo para explorar la página de error y conocer la distinta información que ofrece.</p>
<p>La página de error de Django es capaz de mostrar más información en ciertos casos especiales, como el caso de errores de sintaxis de plantilla. Los veremos más tarde, cuando hablemos del sistema de plantillas de Django. Por el momento, descomente las líneas del offset = int (offset) para obtener la función de vista funcionando correctamente de nuevo.</p>
<h3>Enlaces Relacionados:</h3>
<ul>
<li><a href="http://www.cibernatural.com/tutorial-de-django-i">Tutorial de Django I</a></li>
<li>Tutorial de Django II</li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-iii">Tutorial de Django III</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-iv">Tutorial de Django IV</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-v">Tutorial de Django V</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vi">Tutorial de Django VI</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vii">Tutorial de Django VII</a></li>
</ul>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=453">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/tutorial-de-django-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web Residencial Grenwich-Lanzarote</title>
		<link>http://www.cibernatural.com/web-residencial-grenwich-lanzarote/</link>
		<comments>http://www.cibernatural.com/web-residencial-grenwich-lanzarote/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 19:09:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Construcción]]></category>
		<category><![CDATA[Inmobiliaria]]></category>
		<category><![CDATA[Lanzarote]]></category>
		<category><![CDATA[Playa Blanca]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=440</guid>
		<description><![CDATA[Cibernatural S.L. estrena la página web http://www.grenwich-lanzarote.com, Complejo Residencial de apartamentos de lujo en Playa Blanca &#8211; Lanzarote. En ella puede ver los distintos tipos de apartamentos disponibles, una completa galería de imágenes, planos en formato PDF, el equipamiento de cada uno de ellos, así como la situación del complejo, el entorno, las actividades de [...]]]></description>
			<content:encoded><![CDATA[<p>Cibernatural S.L. estrena la página web <a href="http://www.grenwich-lanzarote.com">http://www.grenwich-lanzarote.com</a>, Complejo Residencial de apartamentos de lujo en Playa Blanca &#8211; Lanzarote.</p>
<p>En ella puede ver los distintos tipos de apartamentos disponibles, una completa galería de imágenes, planos en formato PDF, el equipamiento de cada uno de ellos, así como la situación del complejo, el entorno, las actividades de ocio a realizar y los servicios que le ofrece Grenwich S.A. para realizar todos los trámites ya sea para la compra, alquiler, o alquiler con opción a compra.</p>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=440">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/web-residencial-grenwich-lanzarote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial de Django &#8211; I</title>
		<link>http://www.cibernatural.com/tutorial-de-django-i/</link>
		<comments>http://www.cibernatural.com/tutorial-de-django-i/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:19:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Técnico]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=432</guid>
		<description><![CDATA[Introducción a Django Django es un framework de desarrollo web escrito en Python con el que usted puede construir y mantener aplicaciones web de alta calidad con un mínimo de esfuerzo. Instalar Python Django está escrito completamente en Python, por lo que el primer paso en la instalación del marco es el asegurarse de que [...]]]></description>
			<content:encoded><![CDATA[<h2><strong><span style="text-decoration: underline;">Introducción a Django</span></strong></h2>
<p>Django es un framework de desarrollo web escrito en Python con el que usted puede construir y mantener aplicaciones web de alta calidad con un mínimo de esfuerzo.</p>
<h3><strong>Instalar Python</strong></h3>
<p>Django está escrito completamente en Python, por lo que el primer paso en la instalación del marco es el  asegurarse de que tiene Python instalado.</p>
<p><a href="http://www.python.org/download/">http://www.python.org/download/</a></p>
<h3><strong>Instalar Django</strong></h3>
<p><a href="http://www.djangoproject.com/download/">http://www.djangoproject.com/download/</a></p>
<blockquote><p>
Linux:   sudo python setup.py install<br />
Windows:   python setup.py install
</p></blockquote>
<p>Los archivos de Django se instalarán en el directorio site-packages de su instalación de Python, en donde Python busca las bibliotecas de terceros.</p>
<h3><strong>Prueba de la instalación de Django</strong></h3>
<p>En una shell de comandos, cambie a otro directorio (no el directorio que contiene el directorio de Django) e inicie el intérprete de Python interactivo escribiendo python. Si la instalación fue exitosa, usted debe ser capaz de importar el módulo de Django:</p>
<blockquote><p>&gt;&gt;&gt; import django<br />
&gt;&gt;&gt; django.VERSION<br />
(1, 1, 0, &#8216;final&#8217;, 1)
</p></blockquote>
<h3><strong>Establecer una base de datos</strong></h3>
<p>En este punto, usted podría comenzar a escribir una aplicación Web con Django, porque el único requisito previo es una instalación de Python. Sin embargo, es probable que desarrolle un sitio web controlado por base de datos, en cuyo caso tendrá que configurar un servidor de base de datos.</p>
<p>Django es compatible con cuatro motores de base de datos:</p>
<ul>
<li>PostgreSQL (<a href="http://www.postgresql.org/">http://www.postgresql.org/</a>)</li>
<li>SQLite 3 (<a href="http://www.sqlite.org/">http://www.sqlite.org/</a>)</li>
<li>MySQL (<a href="http://www.mysql.com/">http://www.mysql.com/</a>)</li>
<li>Oracle (<a href="http://www.oracle.com/">http://www.oracle.com/</a>)</li>
</ul>
<p>La configuración de la base de datos es un proceso de dos pasos:</p>
<ol>
<li>En primer lugar, tendrá que instalar y configurar el servidor de base de datos.</li>
<li>En segundo lugar, tendrá que instalar la librería Python para nuestra base de datos de back-end. Esto es código Python de terceros que permite interactuar con la base de datos.</li>
</ol>
<h3><strong>Uso de Django con MySQL</strong></h3>
<p>Django requiere MySQL 4.0 o superior. Las versiones 3.x no soportan subconsultas anidadas y algunas otras sentencias SQL estándar .</p>
<p>También tendrá que instalar el paquete de MySQLdb desde <a href="http://www.djangoproject.com/r/python-mysql/">http://www.djangoproject.com/r/python-mysql/</a>.<br />
En Linux, puede comprobar si su paquete de distribución del sistema de gestión ofrece un paquete llamado python-mysql, python-MySQLdb, mysql-python, o algo similar.</p>
<h3><strong>Iniciar un proyecto</strong></h3>
<p>Una vez que haya instalado Python, Django, y (opcionalmente) el servidor/librería de base de datos, puede dar el primer paso del desarrollo de una aplicación Django mediante la creación de un proyecto.</p>
<p>Un proyecto es una colección de ajustes de una instancia de Django, incluyendo la configuración de la base de datos, las opciones específicas de Django, y la configuración de la aplicación.</p>
<p>Si es la primera vez que usa Django, usted tendrá que tener cuidado con la configuración inicial. Cree un nuevo directorio para comenzar a trabajar, tal vez algo como /home/nombre de usuario/djcode/</p>
<p>Vaya al directorio que ha creado y ejecute el comando siguiente:</p>
<blockquote><p>django-admin.py startproject mysite</p></blockquote>
<p>Esto creará un directorio <em>mysite</em> en el directorio actual.</p>
<p>El comando startproject crea un directorio que contiene cuatro archivos:</p>
<p>mysite/</p>
<p style="padding-left: 30px;">__init__.py<br />
manage.py<br />
settings.py<br />
urls.py</p>
<ul>
<li>__init__.py: Un archivo necesario para que Python trate el directorio mysite como un paquete (un grupo de módulos de Python). Es un fichero vacío, y normalmente no se le añade nada.</li>
<li>manage.py: Utilidad de línea de comandos que le permite interactuar con el proyecto Django de diversas maneras. Con python manage.py puede tener una idea de lo que puede hacer. Usted nunca tiene que editar este archivo, sino que se crea en el directorio por pura conveniencia.</li>
<li>settings.py: Características de configuración de este proyecto Django. Echele un vistazo para tener una idea de los tipos de configuraciones disponibles, junto con sus valores predeterminados.</li>
<li>urls.py: Las direcciones URL de este proyecto Django. Piense en ello como la &#8220;tabla de contenidos&#8221; de su sitio Django. Por el momento, está vacío.</li>
</ul>
<p>A pesar de su pequeño tamaño, estos archivos ya constituyen una aplicación Django de trabajo.</p>
<h3><strong>Ejecutar el servidor de desarrollo (runserver)</strong></h3>
<p>El servidor de desarrollo de Django (también llamado runserver debido al comando que lanza) es un servidor web ligero que puede utilizar durante el desarrollo de su sitio. Está incluido con Django para que pueda desarrollar su sitio rápidamente, sin tener que lidiar con la configuración del servidor de producción (Apache, por ejemplo) hasta que esté listo para la producción.</p>
<p>El servidor de desarrollo rastrea su código y automáticamente vuelve a cargarlo, por lo que es fácil para usted cambiar el código sin necesidad de reiniciar nada.</p>
<p>Para iniciar el servidor, vaya al directorio del proyecto si no lo ha hecho, y ejecute este comando:</p>
<blockquote><p>python manage.py runserver</p></blockquote>
<p>Esto iniciará el servidor de forma local en el puerto 8000, accesible sólo para las conexiones de su propio equipo. Ahora que está en ejecución, visite <strong>http://127.0.0.1:8000/</strong> con su navegador Web. Verá un &#8220;Welcome to Django&#8221;  ¡Funciona!</p>
<h3>Enlaces relacionados:</h3>
<ul>
<li>Tutorial de Django I</li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-ii">Tutorial de Django II</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-iii">Tutorial de Django III</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-iv">Tutorial de Django IV</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-v">Tutorial de Django V</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vi">Tutorial de Django VI</a></li>
<li><a href="http://www.cibernatural.com/tutorial-de-django-vii">Tutorial de Django VII</a></li>
</ul>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=432">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/tutorial-de-django-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web del C.D. Gymnástica GranaSport</title>
		<link>http://www.cibernatural.com/web-del-c-d-gymnastica-granasport/</link>
		<comments>http://www.cibernatural.com/web-del-c-d-gymnastica-granasport/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:23:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tenerife]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.cibernatural.com/?p=307</guid>
		<description><![CDATA[Desarrollo de la Web corporativa del Club Deportivo Gymnástica GranaSport, dedicado fundamentalmente a las clases de Gimnasia Rítmica y Ballet, y la organización de shows vinculados a la danza y la gimnasia, en la Isla de Tenerife. http://www.gimnasticagranasport.es/ Descargar en PDF]]></description>
			<content:encoded><![CDATA[<p>Desarrollo de la Web corporativa del Club Deportivo <a href="http://www.gimnasticagranasport.es/">Gymnástica GranaSport</a>, dedicado fundamentalmente a las clases de Gimnasia Rítmica y Ballet, y la organización de shows vinculados a la danza y la gimnasia, en la Isla de Tenerife.<br />
<br/><br/><br />
<a href="http://www.gimnasticagranasport.es/">http://www.gimnasticagranasport.es/</a><br />
<br/><br/><br />
<img src="http://www.cibernatural.com/wp-content/uploads/2009/10/granasport11-300x225.jpg" alt="granasport1" title="granasport1" width="300" height="225" class="aligncenter size-medium wp-image-311" /><br />
<img src="http://www.cibernatural.com/wp-content/uploads/2009/10/granasport21-300x225.jpg" alt="granasport2" title="granasport2" width="300" height="225" class="aligncenter size-medium wp-image-312" /><br />
<img src="http://www.cibernatural.com/wp-content/uploads/2009/10/granasport31-300x225.jpg" alt="granasport3" title="granasport3" width="300" height="225" class="aligncenter size-medium wp-image-313" /><br />
<img src="http://www.cibernatural.com/wp-content/uploads/2009/10/granasport4-300x225.jpg" alt="granasport4" title="granasport4" width="300" height="225" class="aligncenter size-medium wp-image-314" /></p>

                            <div id="aspdf">
                                <a href="http://www.cibernatural.com/wp-content/plugins/as-pdf/generate.php?post=307">
                                    <span>Descargar en PDF</span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://www.cibernatural.com/web-del-c-d-gymnastica-granasport/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
