Jinja2 + Django: globalne funkcije i filteri

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") }} 

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

Pošaljite nam poruku »