miércoles, 6 de abril de 2011

Django con generic views

Nota: generic_views a partir de Django 1.3 compórtanse como clases, tal e como indican no manual (migración)

Imos progresando con Django. Onte descubrín as generic_views, e de cómo levo facendo o "mono" creando funcións en views.py para cargar os modelos da base de datos. generic_views veñen na instalación de Django en django.views.generic, así que abrimos unha consola python/django
python manage.py shell
>>>import django.views.generic
>>>help(django.views.generic)

Obtendo a documentación da nosa instalación. Na miña sae:
PACKAGE CONTENTS
    create_update
    date_based
    list_detail
    simple

E así sabemos qué librerías de generic_views temos dispoñibles. Podemos importar estas librerías para saber cómo funcionan, e pedir axuda igual que antes:
python manage.py shell
>>>import django.views.generic.create_update
>>>help(django.views.generic.create_update)

Para o exemplo utilizaremos create_object, función que engade unha entrada na base de datos baseándose no modelo.

Modelo


/elements/models.py

from django.db import models

class Content(models.Model):
    family_choices = (
        ("A", "A family"),
        ("B", "B family"),
        ("C", "C family"),
    )

    name = models.CharField(max_length=50)
    family = models.CharField(max_length=8, choices=family_choices)
    subfamily = models.CharField(max_length=50)
    content = models.CharField(max_length=32767)
    add_date = models.DateTimeField()
    def __unicode__(self):
        return self.name

Template


O template, según vimos na axuda help(django.views.generic.create_update) debe estar ubicado de forma que o Django o atope. A documentación decía Templates: "app_label/model_name_form.html", que no noso caso sería elements/content_form.html.

<form method="post" action=".">
{{ form.as_p }}
<input type="submit" />
</form>

Como é normal, podemos envolver este formulario en calquer {% block %} que entre ben no noso deseño.

Urls


Nas urls.py está a clave da cuestión. No urls.py base poñeremos:
(r'^elements/', include('noso_app.elements.urls'))
E en elements/urls.py poñeremos:

from noso_app.elements.models import Content
...
(r'^add/$', 'django.views.generic.create_update.create_object', dict(model=Contents, post_save_redirect="/elements/"))

O parámetro "post_save_redirect" será a url á que iremos despóis de facer o gardado na base de datos.

Resultado


Agora cando entremos no noso dominio.com/elements/add, sairanos un formulario que automáticamente gardará as entradas na base de datos. Parece complicado, pero si nos fixamos estamos evitando calquer interacción directa coa base de datos, nin temos que escribir ningún views.py para manexar a entrada de datos. Si navegamos na documentación de generic_views atoparemos atallos para listar, borrar, actualizar... sin picar case nada de código.

miércoles, 16 de marzo de 2011

Prototype + JSON + HTML

Hoxe sí que rompín os cornos cunha nadería. Question is, temos un cálculo longo nun clúster, e queremos ir actualizando a páxina web según vaian saíndo os resultados, vía Ajax (prototype). Ahí vai o script no lado do cliente:


function test_job(){
var html_target = $('status'); /* modificaremos o <div id="status"></div>*/
var html_target2 = $('results'); /* cando rematemos, modificamos <div id="results"></div>*/

var job_list = {tasks: {[1, 2, 3, 4]}; /*estas son os pid no cluster, pódense xerar dinámicamente*/

job_state = new Ajax.PeriodicalUpdater("", '/testcluster/'){

/* O servidor web atende as peticións en http://noso_server.com/testcluster/ */
/* No lado do servidor, éste pregunta ó clúster como van as tareas de job_list */
/* que responderá cun diccionario de "running", "delayed" e "finished". */
/* Con esta resposta, o servidor xenera un contido "html" para ver no */
/* <div id="status"></div>, e pásallo ó cliente por JSON */
/* A clave está en pasarlle a PeriodicalUpdater un item vacío, porque senón */
/* actualizaríao con todo o paquete JSON que se recibe */

method: 'post',
content_type: "application/json",
parameters: job_list,
frequency: 5,
decay: 1,
onSuccess: function(transport){
json_content = transport.responseJSON;
pending_jobs = json_content["running"].length;
delayed_jobs = json_content["delayed"].length;
html_target.update(json_content["html"]);
if((pending_jobs + delayed_jobs) == 0 ){
job_state.stop(); /*Xa non quedan máis jobs, paramos o Updater */
new Ajax.Request('/getresults/', {
onSuccess: function(response){
html_target2.update(response.responseText);
}
});
}
}
});
}

/* E con esta liña lanzamos o Periodical updater tan pronto se carga a páxina */
Event.observe(window, 'load', test_job, false);

viernes, 20 de junio de 2008

Instalación de python

Para instalar python nun Windows NT (NT, 2000, XP, Vista) haberá que baixarse o instalador da páxina oficial: Instaladores. Escollemos o último publicado (hoxe é 2.5.2), chegamos á páxina onde podemos precisar o sistema operativo e procesador. Normalmente o de "x86 processors" sirve, ainda que si sabemos fixo que temos un 64 bits Intel ou AMD podemos tentar esa versión en concreto.

Unha vez baixado, o programa instalarase con un doble-clic é o proceso normal de instalación.