<?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>4 bits blog &#187; Python</title>
	<atom:link href="http://blog.4bits.es/category/lenguajes/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.4bits.es</link>
	<description>Ahora en 16 colores</description>
	<lastBuildDate>Thu, 05 Aug 2010 13:52:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Los formularios en django</title>
		<link>http://blog.4bits.es/los-formularios-en-django/</link>
		<comments>http://blog.4bits.es/los-formularios-en-django/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 10:49:33 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=573</guid>
		<description><![CDATA[Después de ver las vistas de django y los modelos de django, toca ver cómo crear formularios web para poder interactuar con los datos de la aplicación. La clase Forms de django Los formularios en django son clases que heredan la clase Forms del módulo django.forms, las partes más interesantes de este módulo son los: [...]]]></description>
			<content:encoded><![CDATA[<p>Después de ver <a href="http://blog.4bits.es/las-vistas-de-django/">las vistas de django</a> y <a href="http://blog.4bits.es/los-modelos-de-django/">los modelos de django</a>, toca ver cómo <strong>crear formularios web para poder interactuar con los datos de la aplicación.</strong></p>
<h3>La clase Forms de django</h3>
<p>Los formularios en django son clases que heredan la clase <code>Forms</code> del módulo <code>django.forms</code>, las partes más interesantes de este módulo son los:</p>
<ul>
<li><strong>Widgets:</strong> son los elementos que forman un formulario, por ejemplo: un cuadro para la introducción de texto (<code>&lt;input type="text"&gt;</code>).</li>
<li><strong>Campos:</strong> Son clases que representan el tipo de datos que tendrán las diferentes partes del formulario, de modo que al enviar el formulario se validarán que se introducirán ese tipo de datos. Por ejemplo: <code>CharField</code> indicará un campo de texto (como se puede ver es similar a los datos de los modelos).<br />
Además, los campos se transforman automáticamente en <em>widgets</em> que tienen asociados de forma predeterminada, o indicándoles el <em>widget</em> que se quiere usar.</li>
</ul>
<p>En el caso que se ha venido realizando en estos posts, un formulario para introducir los datos del usuario podría ser:</p>
<pre class="brush:python"># forms.py
#-*- coding: utf-8 -*-

from django import forms

class FormularioUsuario (forms.Form):
    """Formulario para guardar un usuario en la base de datos."""

    nombre = forms.CharField (max_length=40)
    apellidos = forms.CharField (max_length=40)
    email = forms.EmailField ()</pre>
<p>Este formulario se podrá utilizar en la vista correspondiente de modo que cualquiera pueda introducir los datos de un usuario y que la vista los procese para guardarlos en la base de datos.</p>
<h3>Utilizando el formulario en una vista de django</h3>
<p>Una vez creado el formulario se podrá utilizar desde una vista, de modo que se puedan recibir y validar los datos que alguien introduzca en dicho formulario. En el caso de ejemplo se podría tener una vista para guardar nuevos usuarios:</p>
<pre class="brush:python"># views.py
# -*- coding: utf-8 -*-

from proyecto.aplicación.forms import FormularioUsuario
from proyecto.aplicación.models import Usuario
from django.shortcuts import render_to_response

def guardar_usuario (request):
    """Guarda los datos de un usuario en la base de datos."""

    # Se ha enviado el formulario utilizando POST
    if request.method == 'POST':

        # Se consiguen los datos del formulario
        form = FormularioUsuario (request.POST)

        # Se validan los campos del formulario
        if form.is_valid():
            usuario = Usuario ()

            # Se consiguen los datos filtrados del formulario
            usuario.nombre = form.cleaned_data['nombre']
            usuario.apellidos = form.cleaned_data['apellidos']
            usuario.email = form.cleaned_data['email]

            try:
                usuario.save ()

                # Se redirecciona a la página que confirma que
                # se ha guardado el usuario
                return HttpResponseRedirect ('/usuario/guardado/')

            # No se ha podido guardar
            except:
                return HttpResponseRedirect ('/usuario/incorrecto/')    

    # Algún dato del formulario es incorrecto
    else:
        # Se crea un formulario vacío
        form = FormularioUsuario ()

    # Se vuelve a la página del formulario
    return render_to_response ('usuario.html', { 'form': form })</pre>
<p>Para mostrar el formulario en el archivo «usuario.html» (que es una plantilla de django) se puede utilizar el siguiente trozo de código:</p>
<pre class="brush:html">&lt;form action="/guardar/" method="post"&gt;
    {{ form.as_p }}
    &lt;input type="submit" value="Guardar" /&gt;
&lt;/form&gt;</pre>
<p>Con esto se muestra el formulario separando los elementos de éste entre párrafos, existen otras formas de mostrar el formulario utilizando otro tipo de separadores, como siempre para más información está la documentación sobre <a href="http://docs.djangoproject.com/en/1.2/topics/forms/#displaying-a-form-using-a-template">cómo representar los formularios en las plantillas de django</a>.</p>
<h3>Creando un formulario a partir de un modelo de django</h3>
<p>Si como en este caso se quiere crear un formulario que contendrá los mismos datos que un modelo ya creado, django permite crear formularios a partir de modelos ya creados. Para ello sólo se debe crear la clase del formulario que herede la clase <code>ModelForm</code> del módulo <code>django.forms</code> y luego crear una clase <code>Meta</code> dentro de la del formulario.</p>
<p>En este caso sería algo así:</p>
<pre class="brush:python"># forms.py
#-*- coding: utf-8 -*-

from proyecto.aplicación.models import Usuario
from django import forms

class FormularioUsuario (forms.ModelForm):
    """Formulario generado a partir del modelo Usuario."""

    class Meta:
        model = Usuario</pre>
<p>Este ejemplo es bastante básico, ya que este método de creación de formularios partiendo de modelos tiene bastante más opciones, como la posibilidad de excluir campos del modelo en el formulario, ordenarlos, etc.</p>
<p>Como siempre lo mejor es consultar la documentación sobre <a href="http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#topics-forms-modelforms">cómo crear formularios partiendo de modelos de django</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/los-formularios-en-django/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Las vistas de django</title>
		<link>http://blog.4bits.es/las-vistas-de-django/</link>
		<comments>http://blog.4bits.es/las-vistas-de-django/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 14:17:43 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=473</guid>
		<description><![CDATA[En el anterior post sobre los modelos de django, se explicaba cómo se crean los modelos de datos que se usan con la base de datos, pero no se vio ningún modo de trabajar con ellos a parte de la consola de django. Las vistas Las vistas se encargan de la capa lógica de la [...]]]></description>
			<content:encoded><![CDATA[<p>En el anterior post sobre <a href="http://blog.4bits.es/los-modelos-de-django/">los modelos de django</a>, se explicaba cómo se crean los modelos de datos que se usan con la base de datos, pero no se vio ningún modo de trabajar con ellos a parte de la consola de django.</p>
<h3>Las vistas</h3>
<p><strong>Las vistas se encargan de la capa lógica de la aplicación web</strong>, esto es realizan las tareas necesarias sobre los datos recibidos y devuelven los datos necesarios para que se muestren en la web.</p>
<p>En el caso de django, <strong>las vistas son funciones de python que reciben un objeto <code>HttpRequest</code> y que devolverán un objeto <code>HttpResponse</code></strong>. Estas funciones se relacionarán con diferentes direcciones de la aplicación web, gracias al archivo «urls.py».</p>
<h3>Creando una vista</h3>
<p>Como ya se explicó brevemente en el post de <a href="http://blog.4bits.es/primeros-pasos-con-django">introducción a django</a>, las vistas se definen en el archivo «views.py» de la aplicación a desarrollar.</p>
<p>Siguiendo con el ejemplo del modelo de un usuario, se podrían definir las siguientes vistas:</p>
<pre class="brush:python"># views.py
# -*- coding: utf-8 -*-

from proyecto.aplicación.models import Usuario
from django.shortcuts import render_to_response

def mostrar (request):
    """Muestra los datos de los usuarios de la base de datos."""

    usuarios = Usuario.objects.all ()
    return render_to_response ('mostrar.htm',
                               { 'usuarios' : usuarios })</pre>
<p>En este ejemplo se ha definido una vista para mostrar todos los usuarios de la base de datos, para ello se puede ver que se hace uso de un «QuerySet» (explicado en el post sobre los modelos de django).</p>
<p>Además, se puede observar que la función de la vista recibe un parámetro <code>request</code> (que será un objeto <code>HttpRequest</code>) y devuelve un objeto <code>HttpResponse</code> mediante <strong>la función <code>render_to_response</code>, que genera una página HTML a partir de una plantilla y los datos que se le proporcionen mediante un diccionario</strong> (en este ejemplo el diccionario sólo contendrá los usuarios de la base de datos).</p>
<h3>Asociando direcciones a las vistas</h3>
<p>Una vez creadas <strong>las funciones de las vistas, éstas se deberán asociar con sus correspondientes direcciones dentro de la aplicación web, todo esto se realiza editando el archivo «urls.py»</strong>. Este archivo contiene, básicamente, una variable llamada <code>urlpatterns</code> a la que se asignan una serie de tuplas de expresiones regulares que definen las direcciones y sus funciones asociadas.</p>
<p>Siguiendo el ejemplo, la aplicación tendría el siguiente archivo «urls.py»:</p>
<pre class="brush:python"># urls.py
# -*- coding: utf-8 -*-

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^usuario/mostrar/$', 'proyecto.aplicación.views.mostrar'),
)</pre>
<p>El archivo «urls.py» se crea a nivel de proyecto, pero se puede dividir en varios, de modo que se puedan definir las direcciones a nivel de aplicación para una mayor modularidad y reutilización.</p>
<p>Como siempre, para más información se puede consultar la documentación sobre <a href="http://docs.djangoproject.com/en/1.1/topics/http/urls/">cómo asociar direcciones a las vistas en django</a>.</p>
<h3>Una breve introducción a las plantillas</h3>
<p>Django usa un lenguaje de plantillas para generar las páginas web de la aplicación, estas plantillas son archivos HTML con algunas etiquetas propias de Django, que éste procesará y sustituirá por el contenido adecuado. Las etiquetas del lenguaje de plantillas de django permiten hacer muchas cosas, como: bucles, condiciones, herencia de plantillas, internacionalización, &#8230;</p>
<p><strong>Los archivos de las plantillas se pueden crear a nivel de proyecto o de aplicación</strong>. Normalmente, se suele crear una plantilla base de la que se heredará la estructura en las plantillas de las diferentes aplicaciones del proyecto, de modo que éstas tengan una mayor modularidad.</p>
<p><strong>Estos archivos se pueden guardar en cualquier directorio dentro del proyecto y/o aplicación, pero por conveniencia se suelen crear directorios llamados «templates» a nivel de proyecto y aplicación</strong>, además django suele buscar en estos directorios de forma predeterminada, mientras que si se les da otro nombre, se deberán configurar las rutas de estos directorios en el archivo «settings.py».</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;

&lt;html&gt;

&lt;head&gt;
    &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /&gt;

    {% if usuario %}
        &lt;title&gt;Lista de usuarios&lt;/title&gt;
    {% else %}
        &lt;title&gt;No hay ningún usuario&lt;/title&gt;
    {% endif %}

&lt;/head&gt;

&lt;body&gt;

    {% if usuarios %}

        {% for usuario in usuarios %}
        &lt;h1&gt;{{ usuario.email }}&lt;/h1&gt;

        &lt;p&gt;{{ usuario.nombre }} {{ usuario.apellidos }}&lt;/p&gt;
        {% endfor %}

    {% else %}

        &lt;h1&gt;No hay ningún usuario.&lt;/h1&gt;

        &lt;p&gt;La base de datos de usuarios está vacía.&lt;/p&gt;

    {% endif %}

&lt;/body&gt;

&lt;/html&gt;</pre>
<p>En este ejemplo se puede ver que la plantilla trata la lista de usuarios que recibe de la vista y muestra cada usuario, o un mensaje de error si la lista no tuviera ningún usuario. El lenguaje de las plantillas de django intenta ser lo más parecido a Python, siempre que no tengamos en cuenta las llaves y los porcentajes necesarios para marcar las etiquetas de la plantilla.</p>
<p>Para más información se puede consultar la documentación sobre <a href="http://docs.djangoproject.com/en/1.1/topics/templates/#topics-templates">el lenguaje de las plantillas de django</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/las-vistas-de-django/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Los modelos de django</title>
		<link>http://blog.4bits.es/los-modelos-de-django/</link>
		<comments>http://blog.4bits.es/los-modelos-de-django/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 19:06:39 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=400</guid>
		<description><![CDATA[En el anterior post de introducción a django, no se usaron bases de datos, así que en este se verá cómo trabaja django con las bases de datos, es algo realmente sencillo. Los modelos Al basarse django en el MVC, divide la aplicación en dos partes la vista (que ya se pudo ver en el [...]]]></description>
			<content:encoded><![CDATA[<p>En el anterior <a href="http://blog.4bits.es/primeros-pasos-con-django/">post de introducción a django</a>, no se usaron bases de datos, así que en este se verá cómo trabaja django con las bases de datos, es algo realmente sencillo.</p>
<h3>Los modelos</h3>
<p><strong>Al basarse django en el <abbr title="Modelo-Vista-Controlador">MVC</abbr>, divide la aplicación en dos partes la vista (que ya se pudo ver en el anterior post) y el modelo.</strong> El modelo define los datos que utilizará la aplicación, como podrían ser los datos de un usuario (nombre, apellidos, dirección, &#8230;).</p>
<p>En el caso de django, <strong>los modelos serán clases de python que heredarán la clase <code>Model</code> y que utilizarán unos tipos de datos especiales para definir sus atributos.</strong> Más tarde, django, gracias a su <abbr title="Object-Relational Mapping">ORM</abbr>, transformará estas clases en tablas de la base de datos del proyecto.</p>
<h3>Creando un modelo</h3>
<p>Los modelos se definen en el archivo «models.py» de la aplicación de django que los vaya a utilizar. Cada modelo será una clase de python que heredará la clase <code>django.db.models.Model</code>, los atributos de las clases de cada modelo deberán ser instancias de unas clases que ofrece django para poder traducir estos atributos en campos de las tablas de la base de datos. Por ejemplo, para crear el modelo de un usuario:</p>
<pre class="brush:python"># models.py
# -*- coding: utf-8 -*-

from django.db import models

class Usuario (models.Model):
    """Datos del usuario utilizados en la aplicación."""

    nombre = models.CharField (max_length=40)
    apellidos = models.CharField (max_length=60)
    email = models.EmailField (unique=True)

    def __unicode__ (self):
        return '%s %s (%s)' % (self.nombre, self.apellidos, self.email)</pre>
<p>Una breve explicación sobre el ejemplo anterior:</p>
<ul>
<li>Los atributos <code>nombre</code> y <code>apellidos</code> serán dos campos de texto con una longitud máxima de 40 y de 60 caracteres respectivamente en la base de datos.</li>
<li>El atributo <code>email</code> será un campo de texto cuyo valor deberá ser único y que además sólo aceptará direcciones de correo electrónico bien formadas.</li>
<li>El método <code>__unicode__</code> es el equivalente a <code>__str__</code> en python, es decir, se usará cuando se quiera mostrar una instancia de la clase como una cadena de caracteres.</li>
</ul>
<p>Para conocer los tipos existentes para los atributos de los modelos, siempre se puede consultar <a href="http://docs.djangoproject.com/en/1.1/ref/models/fields/#ref-models-fields">la lista de los tipos de los modelos de django</a>.</p>
<p>Una vez se tengan los modelos creados, se deberán <em>sincronizar</em> con la base de datos utilizada.</p>
<h3>Configurando la base de datos</h3>
<p>Configurar la base de datos a utilizar en django es muy sencillo, sólo hay que editar el archivo «settings.py» del proyecto. Concretamente las siguientes variables:</p>
<ul>
<li><code>DATABASE_ENGINE</code> indica el gestor de base de datos utilizado, actualmente django sólo dispone de los siguientes módulos: postgresql_psycopg2, postgresql, mysql, sqlite3 u oracle.</li>
<li><code>DATABASE_NAME</code> indica el nombre de la base de datos, menos en el caso de sqlite3 que indica la ruta al archivo de la base de datos.</li>
<li><code>DATABASE_USER</code> indica el usuario con acceso a la base de datos anterior.</li>
<li><code>DATABASE_PASSWORD</code> indica la contraseña del usuario anterior.</li>
<li><code>DATABASE_HOST</code> indica la dirección del servidor de la base de datos, se debe dejar vacío para la máquina local.</li>
<li><code>DATABASE_PORT</code> indica el puerto del servidor de la base de datos, se debe dejar vacío para usar el puerto predeterminado.</li>
</ul>
<p><strong>Aviso:</strong> El usuario, la contraseña, la dirección y el puerto del servidor no se usan con sqlite3, ya que no son necesarios.</p>
<p>Una vez configurada la base de datos y creados los modelos necesarios, se podrá <em>sincronizar</em> los modelos de las aplicaciones del proyecto con la base de datos, sólo hay que ejecutar:</p>
<pre>$ python manage.py syncdb</pre>
<p><strong>Nota:</strong> Hay que recordar que las aplicaciones del proyecto aparecen en la variable <code>INSTALLED_APPS</code> del archivo «settings.py», yo recomendaría (para estos ejemplos) quitar o comentar las que vienen de manera predeterminada.</p>
<h3>Trabajando con la base de datos</h3>
<p>Esta es una de las mejores cosas que tiene django, y es que para acceder (ya sea para consultar, insertar, actualizar o borrar una entrada) a la base de datos, gracias al ORM sólo se usan las clases definidas como modelos.</p>
<p>Para probar todo lo que se va a explicar sin tener que crearse vistas (que todavía no se han explicado en profundidad) siempre se puede ejecutar la consola de django:</p>
<pre>$ python manage.py shell</pre>
<h4>Insertar, actualizar y borrar entradas</h4>
<p>Tomando como ejemplo la clase <code>Usuario</code> anterior, se podría realizar:</p>
<pre class="brush:python">from proyecto.aplicación.models import Usuario

# Insertar un nuevo usuario
usuario = Usuario (nombre='Pepe', apellidos='Garcia',
                   email='pepe@garcia.es')
usuario.save ()

# Actualizar los datos del usuario
usuario.nombre = 'Jose'
usuario.save ()

# Borrar el usuario
usuario.delete ()</pre>
<p>Como se puede ver es tan sencillo como trabajar con cualquier clase de python.</p>
<h4>Los «QuerySets»</h4>
<p>Los «QuerySets» son conjuntos de objetos de la base de datos, es decir, los resultados de una consulta a la base de datos en forma de objetos de python.</p>
<p>Las clases de los modelos disponen de una instancia del gestor de objetos de la base de datos <code>Clase.objects</code>, en esta instancia se definen los diferentes métodos para realizar las consultas sobre la base de datos, que devolverán un «QuerySet» que contendrá los resultados.</p>
<p>De este modo, tomando el ejemplo de la clase <code>Usuario</code>:</p>
<pre class="brush:python">from proyecto.aplicación.models import Usuario

# Insertar varios usuarios
usuario = Usuario (nombre='Pepe', apellidos='Garcia',
                   email='pepe@garcia.es')
usuario.save ()

usuario = Usuario (nombre='Maruja', apellidos='Perez',
                   email='maruja@perez.es')
usuario.save ()

usuario = Usuario (nombre='Pedro', apellidos='Garcia',
                   email='pedro@garcia.es')
usuario.save ()

# Conseguir todas las entradas de la base de datos
todos_los_usuarios = Usuario.objects.all ()
print 'Todos los usuarios %s' % todos_los_usuarios

# Conseguir los usuarios que se apelliden Garcia
garcias = Usuario.objects.filter (apellidos='Garcia')
print 'La familia Garcia %s' % garcias

# La familia Garcia ordenada por nombre
print 'La familia Garcia ordenada por nombre %s' % garcias.order_by ('name')</pre>
<p>Como siempre esto no es más que una mota de polvo de lo que en realidad se puede hacer, para profundizar lo mejor es consultar <a href="http://docs.djangoproject.com/en/1.1/topics/db/queries/#topics-db-queries">la documentación de django sobre los «QuerySets»</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/los-modelos-de-django/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Primeros pasos con django</title>
		<link>http://blog.4bits.es/primeros-pasos-con-django/</link>
		<comments>http://blog.4bits.es/primeros-pasos-con-django/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 08:37:42 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=377</guid>
		<description><![CDATA[Hace tiempo estuve aprendiendo a programar en Python porque me apeteció y porque me tocó lidiar en el trabajo con una aplicación web, la cual realicé en django. ¿Qué es django? Django es un entorno de desarrollo (lo que en inglés se denomina framework) para la creación rápida de aplicaciones web, basándose en el MVC [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo <a href="http://blog.4bits.es/learning-python/">estuve aprendiendo a programar en Python</a> porque me apeteció y porque me tocó lidiar en el trabajo con una aplicación web, la cual realicé en <a href="http://www.djangoproject.com/">django</a>.</p>
<h3>¿Qué es django?</h3>
<p>Django es un entorno de desarrollo (lo que en inglés se denomina <em>framework</em>) para la creación rápida de aplicaciones web, basándose en el MVC (Modelo-Vista-Controlador).</p>
<p>Entre todas las posibilidades que ofrece están que <strong>permite trabajar con las bases de datos como si no existieran, la creación de URL bonitas sin tener que tocar nada del servidor web, el uso de plantillas en (X)HTML para la creación de las diferentes páginas, y muchas cosas más</strong>, todas ellas estupendas y supongo que todas ellas también las tendrán otros entornos similares que utilicen otros lenguajes de programación.</p>
<h3>Iniciando un nuevo proyecto</h3>
<p>Lo primero que se debe hacer en django es crear lo que se denomina un proyecto, éste a su vez contendrá aplicaciones que serán las que contengan el código utilizado en la aplicación web. Por poner un ejemplo: el proyecto sería un <abbr title="Sistema de Gestión de Contenidos">CMS</abbr> y las aplicaciones las diferentes funcionalidades de dicho <abbr title="Sistema de Gestión de Contenidos">CMS</abbr>.</p>
<p>Para ello se deberá ejecutar:</p>
<pre>$ django-admin.py startproject nombre_del_proyecto</pre>
<p>Esto creará un directorio, llamado «nombre_del_proyecto», con los archivos básicos de todo proyecto de django:</p>
<ul>
<li><code>__init__.py</code> es el archivo de inicialización de cualquier paquete de python.</li>
<li><code>manage.py</code> permitirá la gestión del proyecto de django, como: crear las aplicaciones del proyecto, crear las bases de datos, ejecutar un servidor web para probar el proyecto, &#8230;</li>
<li><code>settings.py</code> contiene la configuración del proyecto, básicamente contiene un montón de variables que utilizará django para la configuración.</li>
<li><code>urls.py</code> contiene los patrones de las direcciones de las diferentes vistas del proyecto de django.</li>
</ul>
<p>Lo malo es que sólo con esto no se va a poder hacer nada más que cambiar unos cuantos valores de la configuración, para que un proyecto haga algo deberá tener al menos una aplicación que contendrá el código necesario.</p>
<h3>Iniciando una nueva aplicación</h3>
<p>Para crear una aplicación se debe usar el archivo «manage.py» del proyecto del siguiente modo:</p>
<pre>$ python manage.py startapp nombre_de_la_aplicación</pre>
<p>Esto creará un directorio, llamado «nombre_de_la_aplicación», con los archivos básicos de toda aplicación de django:</p>
<ul>
<li><code>__init__.py</code> igual que antes, es el archivo de inicialización de cualquier paquete de python.</li>
<li><code>models.py</code> contendrá los modelos de la aplicación, estos modelos son clases de python que se traducirán en tablas en la base de datos.</li>
<li><code>tests.py</code> contendrá tests de la aplicación. <strong>Nota:</strong> Este archivo sólo se crea a partir de la versión 1.1 de django.</li>
<li><code>views.py</code> contendrá las vistas de la aplicación, estas vistas son funciones de python que realizarán las tareas necesarias para mostrar el resultado como una página web.</li>
</ul>
<p>Para que esta aplicación esté disponible en el proyecto, hay que añadirla a la lista de aplicaciones del proyecto que está en el archivo «settings.py».</p>
<pre>INSTALLED_APPS = (
    'hello_world.hello_app',
)</pre>
<p><strong>Nota:</strong> Cuando se crea un nuevo proyecto django crea una lista de aplicaciones predeterminada, que en este caso daría lo mismo borrarlas.</p>
<h3>Creando un «hola mundo»</h3>
<p><strong>Lo primero será crear un proyecto («hello_world») y una aplicación («hello_app») para dicho proyecto</strong>, tal y como se ha mencionado antes. Una vez hecho, se deberá crear una vista para la página web.</p>
<h4>Creando una vista</h4>
<p>Para la creación de una vista, se debe editar el archivo «views.py» de la aplicación creada del siguiente modo:</p>
<pre class="brush:python"># views.py
# -*- coding: utf-8 -*-
# Views used in hello world application.

from django.shortcuts import render_to_response

def hello (request):
    """Hello view function."""

    return render_to_response ('hello.htm',
                               { 'hello_msg' : '¡Hola mundo!' })
</pre>
<p>La función <code>render_to_response</code> usa una plantilla (que ahora se explicará) para crear la página web de la vista.</p>
<h4>Creando una plantilla</h4>
<p>Django dispone de un lenguaje propio para la creación de plantillas, básicamente son archivos HTML con unas etiquetas especiales, que se marcan con llaves dobles, que django se encargará de rellenar.</p>
<p>De este modo, crear una plantilla es tan sencillo como crear un archivo HTML en un directorio llamado «templates» dentro del directorio del proyecto o de la aplicación. En este caso valdría crear un archivo llamado «hello.htm» (es el que se usa en la función <code>hello</code>) en el directorio «templates» de la aplicación «hello_app».</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&gt;

&lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
    &lt;title&gt;{{ hello_msg }}&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;p&gt;{{ hello_msg }}&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Esta es una plantilla muy sencilla, el lenguaje de las plantillas de django permite realizar muchas más cosas, como herencia entre plantillas, definir bloques, bucles, &#8230;</p>
<h4>Definiendo una dirección para la vista</h4>
<p>Una vez creada la vista y su plantilla, habrá que definir una dirección para poder acceder a la vista. Como se mencionó al principio, para eso está el archivo «urls.py» del proyecto. Este archivo contiene una lista de direcciones a las que se les asignará unas vistas, de modo que cuando se abra esa dirección la vista asignada se encargue de crear su correspondiente página web.</p>
<p>En este caso, el archivo «urls.py» quedaría del siguiente modo:</p>
<pre class="brush:python"># urls.py
# -*- coding: utf-8 -*-
# Django URL patterns for hello world project.

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'', 'hello_world.hello_app.views.hello'),
)</pre>
<p>Como se puede ver, lo único que se hace es añadir un patrón (una expresión regular) con una vista asociada. En este caso se trata de una dirección vacía (<code>r''</code>), la raíz del dominio, a la que se asocia la función <code>hello</code> que se definió en las vistas de la aplicación.</p>
<h4>Probando la aplicación web</h4>
<p>Una vez llegado a este punto, ya se puede probar la aplicación web, para ello no hace falta tener ningún servidor web instalado, ya que django dispone de uno para realizar pruebas. Para ejecutarlo, desde el directorio del proyecto:</p>
<pre>$ python manage.py runserver</pre>
<p>Y aquí concluye esta introducción básica, pero larga, próximamente más. Si os ha gustado y queréis ir aprendiendo por vuestra cuenta, siempre podéis leer <a href="http://docs.djangoproject.com/en/dev/">la documentación oficial de django</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/primeros-pasos-con-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Learning Python</title>
		<link>http://blog.4bits.es/learning-python/</link>
		<comments>http://blog.4bits.es/learning-python/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 07:34:11 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=273</guid>
		<description><![CDATA[Learning Python (web) es un libro de introducción al lenguaje de programación Python. Os podría vender la moto para que utilizaseis Python, contando todas las bondades que me han enamorado de este lenguaje, pero haría un post demasiado largo, además de que me desviaría del tema, que es el libro, pero sí Python mola. Python [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.4bits.es/wp-content/uploads/2009/08/lp_3.gif" alt="Learning Python" title="Learning Python" width="150" height="188" class="alignleft size-full wp-image-274" /><strong>Learning Python</strong> (<a href="http://oreilly.com/catalog/9780596513986/">web</a>) es un libro de introducción al lenguaje de programación <a href="http://www.python.org">Python</a>. Os podría vender la moto para que utilizaseis Python, <strong>contando todas las bondades que me han enamorado de este lenguaje, pero haría un post demasiado largo,</strong> además de que me desviaría del tema, que es el libro, pero sí Python mola.</p>
<p>Python es un lenguaje interpretado, similar a Java en la forma de ejecutarse, ya que se ejecuta sobre una <abbr title="Máquina Virtual">MV</abbr>.</p>
<p>En este libro se explican todos los aspectos de Python, para gente que desconozca completamente este lenguaje (como me pasaba a mí cuando lo leí). El libro es bastante grande, el índice marca como última página la 681, pero es que <strong>abarca todos los aspectos básicos de Python</strong>, no incluye todos los módulos que forman parte de Python.</p>
<p>El libro se divide en siete partes más los apéndices:</p>
<ol>
<li>Comenzando <em>(Getting started)</em></li>
<li>Tipos y operaciones <em>(Types and operations)</em></li>
<li>Estamentos y sintaxis <em>(Statements and syntax)</em></li>
<li>Funciones <em>(Functions)</em></li>
<li>Módulos <em>(Modules)</em></li>
<li>Clases y <abbr title="Programación Orientada a Objetos">POO</abbr> <em>(Classes and OOP)</em></li>
<li>Excepciones y herramientas <em>(Exceptions and tools)</em></li>
<li>Apéndices <em>(Appendixes)</em></li>
</ol>
<p>En general, <strong>me ha parecido un libro genial para introducirte en este lenguaje,</strong> quizá muchas veces peca de, podríamos decir, ingenuo y cuenta cosas que cualquiera que se dedique a la programación sabe y se puede saltar.</p>
<p><strong>Recomendación:</strong> Alta.<br />
<strong>Nivel:</strong> Bajo/Medio.<br />
<strong>Idioma:</strong> Inglés.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/learning-python/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
