You are on page 1of 7

The Django template language: for Python programmers

1. Prikazivanje sadržaja pomoću šablona u Python-u je proces od 3 koraka , prvo imamo Engine
(mašina) tj. sistem koji obavlja proces prikazivanja sadržaja na obrazcu, zatim imamo sam obrazac
tj. Template koji tagujemo željenim pozicijama za varijabe i na kraju imamo Context koji povezuje
varijable sa sadržajem koji se renderuje na obrazacu na odgovarajućem mjestu označenom za
varijablu na Template-u.

U Djangu se za svaki DjangoTemplates backend definisan u varijabli TEMPLATES instancira Engine,


i to unutar inicijalizacije DjangoTemplates(BaseEngine) instance koja obmotava Engine() instancu.

izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/

Ispod vidimo da ako je u settings.py APP_DIRS postavljeno na True da će DjangoTemplates engine


da traži template-u unutar templates poddirektorijuma u direktorijumima instaliranih aplikacija.

Pored DjangoTemplates mi možemo kao BACKEND postaviti i Jinja2 i u tom slučaju moramo
instalirati Jinja2 aplikaciju u svoj projekat.

1
izvor: https://docs.djangoproject.com/en/3.2/topics/templates/#django.template.backends.django.DjangoTemplates

Instanciranje Engine-a
2. Ako smo kao BACKEND u settings-u postavili DjangoTemplates onda se za ovu klasu instancira
Engine kao self.engine kao što vidimo ispod Engine(self.dirs, self.app_dirs, **options), gdje se

izvor: https://docs.djangoproject.com/en/3.2/_modules/django/template/backends/django/#DjangoTemplates
U Django source kodu vidim da je BaseEngine definisan kao u snippet-u ispod

Ove opcije -**options koje prihvata Engine instanciran u DjangoTemplates backend-u se takođe
definišu u settings.py TEMPLATES varijabli.

2
Klasa Engine() koja se instancira u DjangoTemplates je data ispod gdje vidimo da će
DjangoTemplates da postavi odgovarajuće vrijednosti za Engine() i da pregazi ove
podrazumijevane.

izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#configuring-an-engine
Ispod vidimo da instanciranje Engin-a direktno mimo backend-a služi da se omogući korištenje
Django template jezika izvan Django projekta, dakle Engine enkapsulira instancu Django template
sistema sa svim potrebnim atributima, metodama i vezama. DjangoTemplates backend je omotač
za django.template.Engine koji ga prilagođava Djangovom template backend API-iju.

izvor: https://docs.djangoproject.com/en/3.2/topics/templates/#engine
U izvornom kodu vidimo kako izgleda Engine klasa, u dokumentaciji se dalje objašnjava kako se ovi
parametri zadaju i šta oni kasnije definišu tj. koja svojstva Engine objekta, kao i metode.

Jinja2 - Backend ne instancira Engine() klasu


3. Ako postavimo vidimo u source kodu za Jinja2 instancu postavljenu kao BACKEND za template
imamo ispod gdje vidimo da se za ovu klasu ne instancira Engine() takođe u tom slučaju na
template-ima koristimo Jinja2 tagove i pravila data u izvoru ispod.

3
izvor: https://docs.djangoproject.com/en/3.2/_modules/django/template/backends/jinja2/#Jinja2
izvor: https://jinja.palletsprojects.com/en/3.1.x/
4. sdfsdf

Template -Korak 2
5. Učitavnje šablona tj. njegovo prosljeđivanje Enginu je najbolje uraditi preko DjangoTemplates
metoda get_template(), select_template() i from_string(). Prva metoda get_template() i treća
metoda from_string() su definisane na DjangoTemplates(BaseEngine) klasi, ali u okviru tih metoda
se pozivaju istoimene metode definisane u Engine klasi, dok je metoda select_template()
definisana isključivo u Engine() klasi, međutim vidimo da ako je backend Engine DjangoTemplate
da možemo da uradimo i direktno instanciranje Templates klase za šta je primjer dat ispod.

izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#loading-a-template
6. Primjeri poziva Engine metoda za dohvatanje template-a.

4
izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#django.template.Engine.from_string
7. sdf

Renderovanje Context-a - Korak 3


8. Za ubacivanje sadržaja na Template koristi se Context i taj proces se naziva renderovanje. Context
objekat prihvata argument koji je rječnik koji mapira nazive varijabli i njihove vrijednosti, na
osnovu naziva varijabli i njihovog poronalaženja na tagovanom Template-u na odgovarajuća
mjesta se postavlja sadržaj koji je definisan u Context rječniku.

Primjeri renderovanja Context-a primjenom Template.render() metode

izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#rendering-a-context
9. sdfd

Varijable i pretraga njihovih atributa tj. lookups


10. Kada na template-u imamo naziv varijable pa iza nje tačku i naziv atributa tada će Django
pokušati da traži sljedećim redoslijedom i vraća prvu vrijednost na koju naiđe:
 prvo pokušava da vidi da li je varijabla rječnik a atribut ključ u tom rječniku
 zatim gleda da li je varijabla objekat koji ima atribut tog naziva
 na kraju gleda da li je varijabla lista a atribut indeks u toj listi
5
Vidimo ispod i upozorenje da će u {{ foo.bar }} pozivu bar da bude posmatran kao atribut za foo
a ne kao bar varijabla u slučaju da je ona definisana u context-u.

izvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#variables-and-lookups

Template varijable i kolabilni atributi


11. Ako imamo neku metodu varijable tada će ako je pozovemo u template-u putem notacije sa
tačkom django template system pokušati da pozove tu metodu i renderuje njenu vrijednost kao
u primjeru ispod.

I
zvor: https://docs.djangoproject.com/en/3.2/ref/templates/api/#variables-and-lookups
12. sdfds
13. Izvori:
https://docs.djangoproject.com/en/3.2/topics/templates/
#django.template.backends.django.DjangoTemplates
6
https://docs.djangoproject.com/en/3.2/ref/templates/api/
https://docs.djangoproject.com/en/3.2/_modules/django/template/backends/django/
#DjangoTemplates
https://docs.djangoproject.com/en/3.2/ref/templates/language/
14.

You might also like