El Blog de Trespams

Blog personal sobre tecnologia, gestió de projectes i coses que se me passen pel cap

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é:

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 :)

blog comments powered by Disqus