Fuente: Learning Django by example 1 start the engine
Hecho en falta Tutoriales de Django en Castellano, si alguien encuentra, que avise
Aquí va mi aportación en traducción a mi manera (se agradecen correcciones).
Otro tutorial más de Django, con un par de diferencias:
* El autor es totalmente novato acerca la programación en Django.
* Cada paso esta cuidadosamente guardado con Google Code , podrás bajarte la última versión para entender cómo evoluciona el proyecto.
Pensando a lo Grande
Realmente adoro la intuitiva interfaz de Delicious Library, - creo que no tiene nada que ver con Del.icio.us -. Lamentablemente es solo para Mac, y no creo que se pueda escalar debido a la falta de un servidor de base de datos.
He decidido hacer Gelman que será la librería de cosas chulas.
Escogí Django por el Bombo “python on rail“, solo necesitaba un ligero framework web en python - Django no es de lo más ligeros – Ojala pueda disfrutar con el proceso de desarrollo.
En el siguiente tutorial quisiera mostrar el código en cada paso cuando mencione “check r#”, puedes hacer el checkout:
HTML:
-
svn checkout http://gelman.googlecode.com/svn/trunk/gelman -r3 gelman
En este caso # es 3. Si google soportara Trac esto sería mucho más fácil.
Arrancando
‘Aquí instalamos Django tenemos múltiples tutoriales para ello, no lo voy a repetir otra vez, el autor usa SqlLite3 por simplicidad, comenta que en producción migrara a MySql’ “check r5”.
Después añadimos la aplicación library:
HTML:
-
python manage.py startapp library
Gelman está diseñado como un ligero gestor de ebooks, con especial atención en la reutilización de componentes y uso de web services. Por ejemplo el metadata es com Amazon Web Service AWS, la etiqueta sugerida viene de Yahoo.
Solo la información esencial es almacenada localmente, como la cartografía entre la metadata y el ebook. Los siguientes modelos, Author, Publisher, y Books se han añadido.
PYTHON:
-
class Book(models.Model):
-
isbn13 = models.CharField(maxlength=13, primary_key=True)
-
name = models.CharField(maxlength=255)
-
authors = models.ManyToManyField(Author)
-
pages = models.IntegerField()
-
publisher = models.ForeignKey(Publisher)
-
pub_date = models.DateTimeField(‘data published’)
ISBN-13 es el ultimo estándar, añadiremos ISBN-10 mas tarde si es necesario, Author y Book tienen una relación Muchos a Muchos, usaremos models.ManyToManyField como se sugiere aquí
Finalmente hacemos:
- Añadimos Django.contrib.admin en INSTALLED_APPS setting
- Sincronizamos el cambio en la BD “sinc”
- Editamos el fichero urls.py para activar la admin page.
Ahora podemos autentificarnos en http://localhost:8000/admin usamos “Bookstack” y “gelman” como Usuario y Password. Check r7
En principio, los libros se añaden manualmente para las pruebas, deberos automatizar este tedioso procedimiento mas tarde. Tener en cuenta la relación entre “Libro” y “Publicador”, esto es realmente guay que la administración nos ayude a relacionar los modelos.

Añadimos una línea a urls.py para activar la interface de usuario para los usarios normales.
HTML:
-
(r‘^library/(?P<isbn>\d+)/$’, ‘gelman.library.views.detail’),
Añadimos a detail.html en “Template/books” como una vista de template, no olvides añadirla en TEMPLATE_DIRS en settings.py, Implementamos detail in “library/views.py”:
PYTHON:
-
def detail(request, isbn):
-
book = get_object_or_404(Book, isbn13=isbn)
-
return render_to_response(‘books/detail.html’, {‘book’: book})
Ahora podemos acceder a la información en “Http://localhost:8000/library/9780596009250/”, esto solo es un aburrido texto que redefiniremos mas tarde. Check r8.
Haciendo feliz al bibliotecario.
En una biblioteca real, el usuario puede navegar, buscar, pedir prestado, devolver libros, pero solo el bibliotecario gestiona la colección, es menos divertido escribir toda la “meta data” del libro mientras nosotros la podemos obtener de Amazon.
Un Bibliotecario utilizar un lector de código de barras, preferimos el titulo o palabra clave que el aburrido numero de 13 dígitos (ISBN).
Vamos a utilizar Ajax, con The Dojo Javascript Toolkit puedes bajarte la versión dojo-1.0.2 obteniendo las completas ventajas de AOL’S CDN.
Como servir ficheros estáticos es probablemente la pregunta más frecuente en #django desde la URLConf basado en expresiones regulares más o menos sobre destructivas.
HTML:
-
(r‘^static/(?P<path>.*)$’, ‘django.views.static.serve’, {‘document_root’: ‘/home/bookstack/projects/media’}),
Preparamos el fichero correctamente:
HTML:
-
cd /home/bookstack/projects/media;
-
mkdir scripts
-
sudo mount -o bind $DOJO_ROOT/trunk scripts
Ahora http://localhost:8000/static/scripts/dojo/dojo.js es donde apunta la librería de dojo
Consideramos que los usuarios introducen el guión el espacio de ISBN, necesitaremos anular la “maxlength” por defecto del atributo ISBN13 and añadir una validación para ISBN usando javascript:
JavaScript:
-
dojo.addOnLoad(function() {
-
var p = dojo.byId(“id_isbn13″);
-
var n = document.createElement(“div”)
-
p.parentNode.appendChild(n);
-
-
dojo.connect(p, ‘onblur’, function() {
-
if(isValidISBN(p.value)) {
-
n.innerHTML = “<div>Searching…</div>”
-
} else {
-
n.innerHTML = “<div>Invalid ISBN</div>”
-
}
-
});
-
p.removeAttribute(“maxlength”);
-
});
NOTA: IsValidISBN se fusiona dentro dojox.validatie.isbn, renombrado como djox.validate.isValidsbn. Esto es uno de beneficiós de usar dojo SVN.
Esto es una buena oportunidad para personalizar la pagina de admin, una nueva template add.html es añadida:
HTML:
-
{% block content %}
-
-
-
<input type=“text” id=“id_isbn13″ class=“vTextField” name=“isbn13″ size=“30″ value=“”/>
-
<input type=“button” id=“search_isbn” value=“Search ISBN” />
-
<div id=“isbn_valid”></div>
-
<input type=“text” id=“id_title” class=“vTextField” name=“title” size=“30″ value=“”/>
-
<input type=“button” id=“search_title” value=“Search Title”/>
-
<form action=“” method=“post” id=“book_form”> <div>
-
<fieldset class=“module aligned ()” id=“books”>
-
<div class=“form-row” id=“firstrow”> No book found
-
</div>
-
</fieldset>
-
-
<input type=“submit” value=“Save and add another” name=“_addanother” />
-
<input type=“submit” value=“Save and continue editing” name=“_continue” />
-
<input type=“submit” value=“Save” class=“default” />
-
</div>
-
-
</div></form>
-
</div>
-
{% endblock %}
Si usamos XmlHttpRequest, tendremos que parsear y crear un proxy para interpretar el aburrido xml, nada de esto es agradable. La interface de AWS's JSONP viene al rescate, en Dojo 0.9, dojo.io.script.get substituye la magica dojo.io.bind con sintasis TWisted , esto es todavia mas agradable.
JavaScript:
-
dojo.connect(searchISBN, ‘onclick’, function() {
-
dojo.io.script.get({
-
url: ‘http://xml-us.amznxslt.com/onca/xml’,
-
content: {
-
Service: ‘AWSECommerceService’,
-
SubscriptionId: ‘19267494ZR5A8E2CGPR2′,
-
AssociateTag: ‘kokogiak7-20′,
-
Operation: ‘ItemLookup’,
-
Style: ‘http://kokogiak.com/amazon/JSON/ajsonSingleAsin.xsl’,
-
ContentType: ‘text/javascript’,
-
IdType: ‘ISBN’,
-
ResponseGroup: ‘Medium’,
-
SearchIndex: ‘Books’,
-
ItemId: isbn.value,
-
},
-
callbackParamName: “CallBack”
-
}).addCallback(function(response) {
-
var item = response.Item;
-
var row = dojo.byId(“firstrow”);
-
row.textContent = null;
-
var node = document.createElement(“div”);
-
node.innerHTML = ‘<div> <img src="’ + item.thumburl + ‘"/> ‘ + item.title;
-
row.appendChild(node);
-
});
-
});
Nota: Todos los parametros son case-Sensitive, especialmente CALLBACK para "callbackParamName" Oh olvidaba añadirlo al repositorio, check r11 para la ultima versión, continuaremos en el capitulo 2 (Pendiente de traducir)
El codigo anterior es una idea dojoized de Kokogiak's, y usaremos us ajsonSingleAsin.xsl para pequeños prototipos, que desarollamos en XSLT para los requerimientos del capitulo siguiente.
