miércoles, 28 de julio de 2010

Notas. Algunos trucos de django

He encontrado algunos trucos en Stack Overflow. Pongo dos que me han gustado. El primero ya lo usaba, pero aun así lo pongo porque me parece básico. El segundo, es más bien de relleno. De los que había es el que más me gustaba. El post me vale más que nada de recordatorio. Iré échando un ojo al hilo de para ver si ponen alguno más que esté bien.

Direcciones relativas en el fichero settings.py:

import os.path
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)



Un decorador para los templates:

@render_to('template.html')
def foo(request):
    bar = Bar.object.all()
    return {'bar': bar}

# equals to
def foo(request):
    bar = Bar.object.all()
    return render_to_response('template.html', {'bar': bar}, context_instance=RequestContext(request))

lunes, 26 de julio de 2010

Nota: Añadiendo south a un projecto existente de django

Hace poco tiempo, miré por encima como funcionaba south, pero no lo había usado hasta ahora. Simplemente había traducido y resumido el tutorial oficial para hacer un mini tutorial, pero sin incluirlo en ningún proyecto.

Ahora se ha añadido al proyecto sobre el que estoy trabajando el módulo south y por lo tanto tenía que añadir las migraciones correspondientes a la base de datos de mi ordenador de desarrollo.

No he sido capaz de añadir south sin borrar los datos que había previamente en las tablas. Me imagino que se podrá, pero como no me ha salido a la primera y los datos que tenía, eran de prueba, simplemente me he cargado las tablas de la base de datos.

El orden que he seguido es el siguiente:

Borrar las tablas de la base de datos se las aplicaciones que vaya a gestionar South.

Eliminar las aplicaciones de INSTALLED_APPS.

Sincronizar la base de datos.

Añadimos de nuevo las aplicaciones a INSTALLED_APPS.

Creamos la primera migración de las aplicaciones que vaya a gestionar South.

python manage.py schemamigration app_name –-initial

Donde app_name es el nombre de la aplicación que gestiona South. Hay que repetir este proceso para cada aplicación que gestionemos con South.

Ahora aplicamos la migración.

python manage.py migrate app_name

A partir de este momento, cada vez que se realice un cambio en los modelos, es necesario crear una nueva migración con:

manage.py schemamigration app_name –-auto


Para aplicar los cambios realizados hay que volver a usar:


python manage.py migrate app_name

domingo, 27 de junio de 2010

Nota: Palabras Clave para los colores en CSS

Palabras clave para los colores en CSS.



X11 color names


http://en.wikipedia.org/wiki/Websafe

jueves, 24 de junio de 2010

Nota: Script en Django

Puede ser una buena idea, para un proyecto de django, tener scripts externos que realicen tareas concretas. Para generar estos scripts, vamos a usar la opción, que tiene django a partir de la versión 1.0, de crear subcomandos para "manage.py". Una vez creado el subcomando, para ejecutar el script, simplemente habrá que ejecutar el fichero "manage.py" pasándole como parámetro nuestro subcomando.

En la página de django, nos muestran como se crean los subcomandos.
Writing custom django-admin commands.


La metodología para crear los subcomandos es muy fácil, en el directorio de una app de django, hay que crear unos directorios y unos ficheros. El fichero que contiene el código del subcomando, tendrá el nombre del subcomando con la extensión "py". Veamos como quedaría el directorio de la app si el nombre del subcomando fuese "my_subcommand":

app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_subcommand.py
    tests.py
    views.py


Por los tanto los ficheros que hay que crear son:
  • management/__init__.py
  • management/commands/__init__.py
  • management/commands/my_subcommand.py

Es importante crear los ficheros __init__.py. Estos ficheros están en blanco, pero indican que los directorios son módulos de python.

En el fichero "management/commands/my_subcommand.py", es donde hay que escribir el código del subcomando.

Como ejemplo, voy a poner un subcomando de "manage.py" que muestre el texto "Hello world!".

Dentro del directorio de cualquier aplicación del proyecto, tiene que estar añadida la aplicación a INSTALLED_APPS, creamos los siguientes ficheros:

  • management/__init__.py
  • management/commands/__init__.py
  • management/commands/hello_world.py


Los ficheros __init__.py están vacíos, y en "management/commands/hello_world.py" copiamos el siguiente código.


from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = 'check unchecked votes'

    def handle(self, *args, **options):
        print "Hello world!"

Para ejecutar el script, hay que ir al directorio principal del proyecto y ejecutar en el terminal:
python manage.py hello_world


Este ejemplo es muy simple, y no usa los modelos de django, pero vale para ver como es la estructura de un subcomando. En el fichero que contiene el código del subcomando, se pueden importar los modelos como en cualquier otro fichero del proyecto.

from myproject.myapp.models import Model


Lo que nos permite generar scripts que interactúen con los modelos creados en nuestro proyecto y usar la metodología de django para trabajar con la base de datos.

Nota: Tutoriales oficiales de django

En la página web de django hay una gran variedad de tutoriales.

http://code.djangoproject.com/wiki/Tutorials

martes, 22 de junio de 2010

nota: lista vacía en python

Comprobación de lista vacía:
a = []
if not a:
    print "list is empty"

miércoles, 9 de junio de 2010

Usando path relativos para los templates de Django

En el archivo settings.py, es necesario indicar donde se encuentran los templates con su path absoluto:
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

Teniendo en cuenta que es código python, podemos hacer que esos paths se calculen a partir de paths relativos. Veamos como.


Es necesario incluir el siguiente código en el fichero settings.py
import os
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))

Una vez añadido este código al fichero, ya podemos indicar el template de forma relativa.

TEMPLATE_DIRS = (
os.path.join(PROJECT_PATH, 'templates')

)