Jinja2 + Django: globalne funkcije i filteri
- Detalji
- 12:37 01.12.2011
Globalne funkcije
Globalne funkcije su funkcije koje su raspoložive za korištenje u svim Jinja2 predlošcima. Prednost korištenja globalnih funkcija je ta da iz predloška možemo izvršiti bilo koji komad koda, a rezultat funkcije prikazati ili jednostavno iskoristiti u logici koda predloška.
Globalna funkcija ima svoju definiciju i implementaciju. Definiciju ćemo staviti u projektni settings.py, a definiciju u zasebnu datoteku, s ostalim globalnim funkcijama Jinja2 template enginea. Ja osobno uglavnom koristim jinja_lib.py.
Za primjer ćemo napisati globalnu funkciju get_current_date() koja vraća formatirani string s tekućim datumom.
U settings.py ide sljedeća definicija, s nazivom funkcije i mjestom gdje se nalazi:
JINJA2_GLOBALS = {
"get_current_date": "project.main.jinja_lib.get_current_date",
}
U jinja_lib.py ćemo napisati funkciju:
def get_current_date():
import datetime
return datetime.date.today().strftime("%d.%m.%Y")
Još nam jedino preostaje da tu funkciju pozovemo iz svog predloška:
Danas je datum {{ get_current_date() }}.
Kako Jinja2, za razliku od Django template enginea, ima mogućnost prijenos parametara funkcija, napisat ćemo i primjer za to: detektirat ćemo koristi li posjetitelj Internet Explorer. To možemo saznati iz request varijable koja bi trebala biti globalno vidljiva u svim predlošcima.
JINJA2_GLOBALS = {
"get_current_date": "project.main.jinja_lib.get_current_date",
"is_internet_explorer": "project.main.jinja_lib.is_internet_explorer",
}
U jinja_lib.py ide sljedeći kod:
def is_internet_explorer(request):
return request.META.get("HTTP_USER_AGENT", "").find("MSIE") != -1
U predlošku ćemo tu funkciju pozvati na sljedeći način:
{% if is_internet_explorer(request) %}
Internet Explorer? Uozbiljimo se!
{% else %}
Odlično! Nije Internet Explorer.
{% endif %}
Dakle, globalne funkcije su izuzetno korisne i podižu opću funkcionalnost template enginea na novu razinu.
Filteri
Koncept filtera je naslijeđen od Django template enginea. Filteri primaju rezultat prethodne funkcije ili vrijednost varijable, obrađuju je i vraćaju nazad. Filteri mogu biti vezani tako da se rezultat jednog filtera prosljeđuje drugom.
Iako filteri ponešto gube smisao uz globalne funkcije, pridonose čitljivosti koda u predlošcima.
Napisat ćemo filter koji formatira datetime objekt u string. Da bismo koristili filter, treba ga prvo deklarirati u settings.py:
JINJA2_FILTERS = {
"project.main.jinja_lib.format_datetime",
}
U jinja_lib.py ćemo implementirati filter:
def format_datetime(value, format="%d.%m.%Y %H:%M"):
try:
return value.strftime(format)
except ValueError:
return u"Greška: Neispravni format."
Kao opcioni parametar filtera smo naveli format u koji će se formatirati datetime objekt. Na kraju filter u svom predlošku koristimo na sljedeći način:
Timestamp objekta: {{ item.timestamp | format_datetime() }}
Timestamp objekta, samo datum: {{ item.timestamp | format_datetime("%d.%m.%Y") }}
Izdvojeni projekti
Slobodni softver
Podržavamo slobodni softver otvorenog koda. Primijenit ćemo ga gdje god je to moguće.
Kontakt
Repetitor
obrt za informatičke tehnologije
Remetinečka cesta 151
Zagreb
OIB: 13595110799
Turistički portal vikendi.com
Zajednica internetskih trgovina svimi.net
Sustav za nadzor i upravljanje solarnim elektranama