Hace un par de días se ha liberado la versión 1.0 final de Haystack. Haystack es probablemente la forma más sencilla de añadir un sistema de búsqueda a Django. Ofrece una API que permite utilizar distintos backends de búsqueda como Solr, Whoosh ó Xapian. Además ofrece una interfaz para realizar las búsquedas llamada SearchQuerySet que es muy similar a las QuerySets de Django.
La documentación de Haystack 1.0 está muy bien detallada y el proyecto está disponible en GitHub: django-haystack.
Publicado por Antonio Melé el Wednesday 2 de December de 2009 | 0 comentarios | Categorías: aplicaciones, pluggables
oEmbed es un formato que permite usar una representación embebida de una URL en sitios web de terceros. La API de oEmbed permite a un sitio web incrustar contenido (como fotos o vídeos) de otros servicios web simplemente con un enlace al recurso que quiere se publicar. De esta forma se evita tener que utilizar una API distinta para incrustar contenidos de cada servicio web. Varios sitios como Flickr, Viddler, Qik, Hulu o Vimeo permiten acceder a sus contenidos mediante oEmbed. Además el sitio web oohEmbed sirve como wrapper para acceder a contenidos de otros sitios como YouTube, Wikipedia ó Wordpress.com entre otros.
Por ejemplo, la URL http://www.flickr.com/services/oembed?url=http://www.flickr.com/photos/ccgd/107274692/ devuelve el XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<oembed>
<version>1.0</version>
<type>photo</type>
<title>Trees Snow and Shadows</title>
<author_name>ccgd</author_name>
<author_url>http://www.flickr.com/photos/ccgd/</author_url>
<cache_age>3600</cache_age>
<provider_name>Flickr</provider_name>
<provider_url>http://www.flickr.com/</provider_url>
<width>500</width>
<height>363</height>
<url>http://farm1.static.flickr.com/44/107274692_c6c32bba58.jpg</url>
</oembed>
Si preferimos recibirlo en formato JSON basta con añadir el parámetro format=json a la misma URL.
Django-oembed es una aplicación que facilita transformar los enlaces a estos servicios que aparecen en el texto introducido por nuestros usuarios en el contenido embebido al que enlazan (vídeos, imágenes, etc.). De esta forma cuando un usuario enlaza a una imagen de Flickr ó un vídeo de Viddler podemos incluirlos directamente.
Para utilizar django-oembed basta con seguir los siguientes pasos:
Descargamos django-oembed e incluimos 'oembed' en el setting INSTALLED_APPS de nuestro settings.py
En la plantilla que queramos utilizar django-oembed para incrustar los contenidos enlazados cargamos los tags de oEmbed:
{% load oembed_tags %}
Utilizamos el tag oembed para reemplazar las URLs con enlaces de sitios que soportan oEmbed por los contenidos a los que éstos apuntan:
{% oembed %}
Una foto muy buena: http://www.flickr.com/photos/ccgd/107274692/
{% endoembed %}
Opcional: Algunos recursos soportan definir un ancho y alto concreto para el contenido a incrustar. Basta con definirlo en el tag oEmbed de la siguiente manera:
{% oembed 320x240 %} ...URL con contenido... {% endoembed %}
Publicado por Antonio Melé el Tuesday 21 de July de 2009 | 0 comentarios | Categorías: aplicaciones, plantillas, pluggables, templatetags
Algo interesante que nos aporta django-command-extensions es poder crear una representación gráfica de nuestros modelos (o por decirlo de otro modo nuestro esquema de base de datos) con tan sólo un comando. Esto es posible gracias a GraphViz y el resultado es algo parecido a un diseño UML. Para poder utilizar este comando debemos tener instalado pygraphviz y por supuesto la aplicación django_extensions debe estar incluída en el setting INSTALLED_APPS de nuestro proyecto.
Para instalar pygraphviz en Linux nos bastará con utilizar el comando:
apt-get install python-pygraphviz
Una vez hemos instalado django-command-extensions y pygraphviz podremos crear un archivo dot, formato utilizado por GraphViz ó una imagen. En nuestro caso vamos a crear un archivo PNG que incluya los modelos de todas las aplicaciones de nuestro proyecto. Para ello usamos el comando:
./manage.py graph_models -a -g -o mis_modelos.png
Con el parámetro -o especificamos el archivo de imagen en el que queremos que se almacene el resultado. Si sólo queremos incluir los modelos de algunas aplicaciones podemos hacerlo con el siguiente comando:
./manage.py graph_models app1 app2 app3 -o mis_modelos.png
Este ejemplo es de los modelos de la PyCon-Tech, un framework de gestión de conferencias basado en Django:

Publicado por Antonio Melé el Sunday 12 de July de 2009 | 0 comentarios | Categorías: aplicaciones, imágenes, modelos, pluggables, trucos, tutorial
Las migraciones o evoluciones de esquema son las modificaciones que hacemos a modelos ya creados y que afectan a la base de datos. Cuando sincronizamos por primera vez los modelos de nuestra aplicación mediante syncdb se crean las tablas necesarias para los mismos en la base de datos. Si tras esto realizamos cambios en nuestros modelos tendremos que ejecutar el comando manage.py reset aplicacion para que se borren las tablas correspondientes a nuestra aplicación y vuelvan a crearse nuevas tablas a partir de los nuevos modelos.
El problema se nos plantea cuando tenemos que realizar cambios en modelos que ya estamos utilizando para almacenar datos y por lo tanto no podemos eliminar sus tablas para volver a crearlas. Esto ocurre sobre todo en los entornos de producción. Las soluciones principales son 2: Modificar nuestro modelo y realizar manualmente los cambios equivalentes en sus respectivas tablas de la base de datos ó utilizar alguna herramienta de migración de esquemas como django-evolution, South ó dmigrations.
Vamos a ver cómo usar django-evolution para realizar nuestras migraciones de esquema de una forma sencilla.
Descarga la última versión mediante svn:
svn checkout http://django-evolution.googlecode.com/svn/trunk/ django-evolution
Añade django_evolution al setting INSTALLED_APPS de tu proyecto.
Ejecuta syncdb para que se creen las tablas de django_evolution con la información inicial sobre tus modelos:
./manage.py syncdb
Modifica los modelos que necesites cambiar
Ejecuta el comando de administración evolve con el parámetro --hint que inspeccionará tus modelos y te mostrará qué migraciones deben hacerse:
./manage.py evolve --hint
evolve --hint por sí sólo mostrará las migraciones que django-evolution cree que deben hacerse, pero no hará nada. Para realizar las migraciones añade al comando anterior el parámetro --execute si estás de acuerdo con las modificaciones que van a hacerse en el esquema de la base de datos. Se modificarán las tablas de los modelos que han cambiado de acuerdo a las modificaciones que has visto con evolve --hint:
./manage.py evolve --hint --execute
Es bueno utilizar evolve --hint antes de realizar una migración ya que conviene asegurarse de que los cambios que se han realizado en los modelos han sido detectados correctamente por django-evolution. Al utilizar evolve con el parámetro --sql descubrirás el código SQL que va a ejecutar dicha migración:
./manage.py evolve --hint --sql
django-evolution también permite escribir y almacenar migraciones para que las ejecutemos cuando queramos. Esto es útil cuando estás desarrollando una nueva versión de tu aplicación web: Por un lado en producción tendrás la versión estable de tu aplicación con sus correspondientes modelos. Por otro lado tendrás la nueva versión de desarrollo con modificaciones en tus modelos. Todas las migraciones que realices sobre los modelos en la versión de desarrollo tendrás que realizarlas más adelante sobre los modelos de la versión en producción. Almacenar migraciones te simplificará esta tarea, para ello tendrás que definir mutaciones en un archivo.
Ya hemos visto que cuando ejecutamos evolve --hint nos aparece la información de las migraciones que van a hacerse en nuestros modelos. Si por ejemplo tenemos un modelo Autor al que añadimos un campo nuevo llamado lugar como el siguiente (con null=True ya que los autores actuales que existan en la base de datos no tendrán lugar definido):
lugar = models.CharField(max_length=100, null=True)
Al ejecutar ./manage.py evolve --hint nos aparecerá la siguiente migración:
#----- Evolution for mi_aplicacion
from django_evolution.mutations import *
from django.db import models
MUTATIONS = [
AddField('Autor', 'lugar', models.CharField, max_length=100, null=True)
]
#----------------------
Trial evolution successful.
Run './manage.py evolve --execute' to apply evolution.
Se ha detectado que hay que ampliar la tabla de la base de datos con el campo lugar que hemos añadido al modelo Autor. Si nos fijamos, django-evolution nos está dando directamente el código que necesitamos para almacenar la migración, con los import correspondientes y la definición de MUTATIONS (mutaciones de los modelos).
Para guardar nuestras migraciones y poder aplicarlas cuando queramos tenemos que crear un directorio evolutions dentro del directorio de nuestra aplicación y añadirle un archivo __init__.py vacío para que sea interpretado como un módulo de Python. Dentro de evolutions podremos añadir un arhivo .py por cada migración que queramos almacenar. En nuestro caso añadiremos add_lugar.py con el código entre líneas ---- que nos ha dado la ejecución del comando ./manage.py evolve --hint. La estructura de archivos quedará así:
/mi_aplicacion
/evolutions
__init__.py
add_lugar.py
models.py
views.py
Y el contenido del archivo add_lugar.py será:
from django_evolution.mutations import *
from django.db import models
MUTATIONS = [
AddField('Autor', 'lugar', models.CharField, max_length=100, null=True)
]
Por último, ya que generalmente aplicaremos varias migraciones, tenemos que definir el orden en el que deben ejecutarse. Para ello añadimos una lista SEQUENCE a evolutions/__init__.py que contiene el nombre de las migraciones a aplicar por orden. Nuestro __init__.py tendrá:
SEQUENCE = ['add_lugar']
¡Ya hemos almacenado una migración! Ahora no nos hará falta utilizar evolve con el parámetro --hint sino que podremos usarlo directamente: ./manage.py evolve nos mostrará las migraciones que van a hacerse (a partir de las que hemos almacenado y su secuencia). Y ./manage.py evolve --execute las ejecutará.
Publicado por Antonio Melé el Thursday 21 de May de 2009 | 2 comentarios | Categorías: aplicaciones, modelos, pluggables
Suscríbete a nuestro feed RSS y al feed de la comunidad para estar al tanto de todo lo que ocurre entorno a Django.
Tú también puedes escribir en éste blog. Para hacerlo basta con que nos digas sobre qué quieres escribir un artículo relacionado con Django.
Utilizar un formulario para modificar 2 modelos
Descubriendo objetos similares por sus etiquetas