Dajaxaproject, segona part
Escrit per Aaloy a 12 de February , 2012 a les 2:26 p.m.
Abans d'escriure aquest apunt de m'he adonat que era el post amb l'identificador 500. Un nombre rodó i que potser mereixeria algun tipus de celebració, però tanmateix no és l'apunt que fa 500, ja que en les proves del codi del blog, segurament vaig afegir i esborrar apunts que han fet anar cap endavant el comptador, realment encara falten prop d'una trentena d'apunts per a arribar al que fa 500, així que deixaré el cava a la gelera.
Hi va haver una proposta de celebrar-ho fent un regal, però pareix que la meva proposta de regalar una capsa d'un Nexus (tot i que comptava amb un possible patrocionador) no ha arribat a cuallar :-P
Així doncs el que faré és reprende l'apunt sobre el dajaxproject, i em centraré en l'altra component, anomenat Dajax.
Dajax
Ja vàrem veure com dajaxice ens deixava fer cridades AJAX cap a la nostra aplicació Django i organitzar-les. Dajax va més enllà in ens permet interactuar amb la interfície d'usuari des de codi Python. Fet servir amb mesura i seny ens pot ajudar també a fer molt més legible el nostre codi i a organtizar millor les accions derivades d'una cridada AJAX dins el mateix codi que les gestiona. No us penseu però que es tracta de quelcom com Pyjamas sinó que són més bé un conjunt de primitives que ens permetran agilitar la feina.
Per començar a jugar-hi necessitareu haver llegit el meu apunt
anterior (o la documentació del projecte) ja que Dajax fa servir la
seva llibreria germana dajaxice i també tenir instal·lat algun dels
frameworks javascript suportats, en el meu cas faré servir jQuery.
Recepta
A la part de servidor
-
Instal·lau django-dajax i posau
dajaxcom a aplicació alsettings.py. -
Posau
from dajax.core.Dajax import Dajaxa l'arxiu ajax.py de la vostra aplicació, junt ambfrom dajaxice.decorators import dajaxice_registerque ja havíem vist abans per a registrar la petició. -
A la funció AJAX instanciarem la classe,
dajax=Dajax() -
Farem el que tinguem que fer dins la funció AJAX i després anirem executant els mètodes de
dajaxque ens interessin per a interaccionar amb la part HTML de l'aplicació. -
Finalment retornarem el json amb
return dajax.json()
A la part de client
Hem de afegir l'arxiu javascript que correspongui segons la llibreria
que volguem fer servir. En el nostre cas jquery.dajax.core.js que es
troba a django-dajax/scr/. En el meu cas la cosa queda com:
{% dajaxice_js_import %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="{{STATIC_URL}}/jquery.dajax.core.js"></script>
En executar-se l'event que ens interessi (un clic normalment) cridarem
la función AJAX que hem registrat de manera semblant a com ho feiem a
l'exemple de Dajaxice, però ara a la funció li passarem com a
paràmetre Dajax.process i un diccionari java de valors opcional, si
la funció té paràmetres.
Important Un ús molt habitual de Dajax es dona en combinació amb els formularis Django, en aquest cas el paràmetre de les dades del formulari. Per a que Django les pugui interpretar bé com a provinents d'un formulari hem de serialitzar-les, si fem servir jQuery això necessita d'una llibreria addicional anomenada serializeobject.
Què es pot fer?
Les funcions que ens proporciona Dajax ens permeten tant manipular l'arbre DOM de la plana web com cridar a funcions javascript ja que tinguem fetes.
*alert(message) Com el seu nou indica hi haureu endivinat,
mostra una alterta javascript amb el missatge que li indiquem.
-
assign(selector, attribute, valor)Donat un selector (id, classe, tipus, ...) i un atribut li asigna el valor el valor que li passam al paràmetre a tots els elements que casin amb el selector. Seria l'equivalent a fer amb jQuery per exemple$('.test').attr('title', 'hola')però enlloc de aplicar-ho sols al primer element com fa jQuery ho aplicaria a tots els elements que tinguin assignada la classetest. -
add_css_class(selector,value). Assigna tots els elements que casin amb el selector la classe css especificada a paràmetrevalue.valuepot ser una cadena o bé una llista de cadenes, en cas de ser una llista s'assignaran totes les classes de la llista. -
remove_css_class(selector,value). Funció complementaria de l'anterior, és a dir, enlloc de posar lleva. -
append(selector,attribute,value)
afegeix a tots els elements que casin amb el seletor l'atribut donat amb el valor indicat avalue`. -
prepend(selector,attribute,value)Afegeix a l'inici a tots els elements que casin amb el selector l'atribut especificat amb el valor que li passam com a paràmetre. -
clear(selector,attribute). Netja l'atribut especificat de tots els elements que casin amb el selector. -
redirect(url,delay=0). Redirecciona la plana cap la nova url després del temps especificat en el paràmetredelay. -
script(code). Executa el codi javascript especificat en el navegador. Per exemple, podem executar l'alert de l'exemple anterior. Hem d'anar un poc alerta amb aquesta funció i evitar fer-ne un mal ús posant-hi tot el codi. Si hem de fer crides, millor posar-les dins el seu corresponent arxiu javascript i fer tan solsscript(la_funcio()). -
remove(selector). Elimina tots els elements que casen amb el selector especificat. -
add_data(data,callback_function). Executa la funció que li especificam en el segon paràmetre amb les dades que hem posat al primer paràmetre. Com el cas d'scriptalerta amb abusar-ne.
Algunes recomanacions
Django té un sistema de plantilles molt potent, es poden fer servir
junt amb assign i remove per a posar els continguts que ens
interessin. Vull dir que no fa falta que una plantilla estigui lligada
a un view sinó que es pot fer servir directament. Mirau-ne
l'API.
Podem generar contingut HTML (o js) directament o fer servir una
plantilla a un fitxer i utilitzar el render_to_string.
Tampoc estam limitats a fer servir el sistema de plantilles de Django per a generar l'HTML segons el que es tengui que tornar potser un sistema com Mako us va millor. Personalment sóc partidari de no mesclar massa.
Errors típics
Sovint et pots passar una bona estona demanant-te perquè no funciona la teva cridada AJAX, així que anem a fer una llista de recomanacions:
-
Reinicia la consola de desenvolupament. A vegades la nova función no es registra bé i no es torna a generar el codi javascript. Si això passa, el símptoma és que tens un error dient que no es troba la funció.
-
Hi ha un error que diu que no es troba Dajax al javascript. Típic de quan t'has oblidat de incloure la llibreria específica pel frameworks que fas servir.
-
Es fa la cridad però no s'executa res. Doncs que t'has deixat el retorn a la funció AJAX. Recorda que normalment hi haurà un
return dajax.json()o si no les cridades no s'efectuaran. -
Django no és capaç d'interpretar el que li enviam al formulari. Ens hem deixat la llibreria
serializeobject -
Teníem events lligats a un element i ara no responen. Típic de quan hem generat nou contingut. Els events s'han de tornar a lligar amb els nous continguts encara que tenguéssin el mateix identificador. Potser fer servir .live() o .delegate() de jQuery ajudaria, però ara per ara jo el que he fet és tornar-los a lligar posant els elements a una funció d'inicialització i tornar-la a cridar amb
script.
Enllaços citats
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Comentaris
1 Comentari de Peter a les 12:02 del Tuesday 14 Feb de 2012
I think that this blog should not be in django community. No body understand you
2 Comentari de aaloy a les 10:02 del Tuesday 14 Feb de 2012
Dear Peter,
Django is not just English people, you can found articles in English, French, German, Italian, this is what is makes a community and not people saying what o who could be there based on the language he speaks or writes.
I you are smart enought to read English you can click on the link in the article which goes to translator or you can find your own translator.
If you don't like the rules remember this is opensource, so you could make your own closed communty with just english speakers.
