Django i utilitats Javascript
Aquest cap de setmana m'he dedicat a fer quatre coses amb Django. Cada cop m'agrada més aquest bastiment. A cada actualització milloren la potència de les plantilles i la funcionalitat del bastiment.
Esper que d'aquí poc la branca anomenada "magic removal" s'integri a la branca principal. Això serà que el bastiment sigui molt més pitònic i expressions que ara patinen un poc deixin de fer-ho. A més esper que arreglin els avisos d'error que dóna el pylint quan no troba una funció que Django defineix en temps d'execució.
He provat què tal se comportaven les plantilles amb le javascrip, i la veritat que molt bé per ara. L'herència de plantilles, tot i que no és molt potent, sí que és molt funcional i fent un bon us dels blocks podem tenir distintes llibreries de javascript segons en convengui a cada pàgina.
Parlant de llibreries i utlitats javascript, n'he trobades dues que van força bé:
- http://www.workingwith.me.uk/articles/scripting/standardista_table_sorting. Javascript per l'ordenació de taules. Va força bé. Sols hi ha que tenir la precaució de que no hi hagi espais en els nombres, ja que en cas contrari els tracta i ordena com a texte.
- qtip És una petita utilita per a mostrar un texte d'ajuda associat a qualsevol tag html.
Me pareix que a partir d'ara aquestes llibreries formaran part del meu repositori d'eines. Les he provades tant amb Mozilla com amb Konqueror i no donen cap problema, la seva utilització és molt fàcil i pesen poc.
També que quedat molt sorprés de la facilitat per exentendre les plantilles i els filtres que té Django. Necessitava un formatejador de nombres per passar un float a una cadena en format moneda, també necessitava l'equivalent a pessetes de la quantitat. Com que això no és lògica de negoci ni res, consider que està bé fer-ho a la capa de presentació, així que he seguit les indicacions que hi havia a un comentari de la documentació de django i la cosa ha anat així:
- Cream un paquet templatetags dins la nostra aplicació.
- Cream l'arxiu __init__.py
- Cream l'arxiu que contindrà els filtres
- Important el paquet amb els filtres a l'arxiu de vistes
- Importam i utilitzam el nou filtre dins la plantilla
La conversió de flotant a cadena no és meva, la vaig trobar a un recull de receptes de Python i l'he adaptada
Així:
filtre.py
"""Filtre per convertir un numero expresat en euros a pessetes"""
def eurtoptas(value):
value = value * 166.386
return moneyfmt(value, places=2)
register.filter(eurtoptas)
def moneyfmt(value, places=2, curr='', sep='.', dp=',', pos='', neg='-', trailneg=''):
"""Convert Decimal to a money formatted string. places: required number of places after the decimal point curr: optional currency symbol before the sign (may be blank) sep: optional grouping separator (comma, period, space, or blank) dp: decimal point indicator (comma or period) only specify as blank when places is zero pos: optional sign for positive numbers: '+', space or blank neg: optional sign for negative numbers: '-', '(', space or blank trailneg:optional trailing minus indicator: '-', ')', space or blank >>> d = Decimal('-1234567.8901') >>> moneyfmt(d, curr='$') '-$1,234,567.89' >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-') '1.234.568-' >>> moneyfmt(d, curr='$', neg='(', trailneg=')') '($1,234,567.89)' >>> moneyfmt(Decimal(123456789), sep=' ') '123 456 789.00' >>> moneyfmt(Decimal('-0.02'), neg='') '' """
value = Decimal(str(value))
q = Decimal((0, (1,), -places))
sign, digits, exp = value.quantize(q).as_tuple()
assert exp == -places
result = []
digits = map(str, digits)
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
if digits:
build(next())
else:
build('0')
build(dp)
i = 0
while digits:
build(next())
i += 1
if i == 3 and digits:
i = 0
build(sep)
build(curr)
if sign:
build(neg)
else:
build(pos)
result.reverse()
return ''.join(result)
register.filter(moneyfmt)
a views.py he afegit
from aplicacio.apps.modul.templatetags import filtre
i a la plantilla
{% load filtre %}
i per fer-ho servir per exemple:
{{item.preu|eurtoptas}}
Això lligat al qtip implica que he pogut posar fàcilment el preu amb euros i després aplical el filtre dins l'ajuda per a mostrar la conversió a pessetes. Jo ho he trobat força elegant, però clar, m'agrada Python :)