I den første delen av denne tre-delte opplæringsserien så vi hvordan du legger ut malstrukturen i en Flask-basert applikasjon ved hjelp av Jinja2. Vi så også hvordan blokker kan brukes til å utnytte arven i maler. I denne delen vil vi dekke hvordan du skriver et egendefinert filter, en tilpasset kontekstprosessor og en makro.
Jeg vil bygge på katalogprogrammet vi opprettet i første del av denne serien. Først vil jeg legge til en tilpasset Jinja2 kontekstprosessor for å vise et beskrivende navn for hvert produkt. Da vil jeg opprette et tilpasset Jinja2-filter for å gjøre den samme jobben som den tilpassede kontekstprosessoren. Da vil jeg demonstrere hvordan man lager en tilpasset Jinja2-makro for vanlige skjemafelter.
Noen ganger kan det være lurt å beregne eller behandle en verdi direkte i malene. Jinja2 opprettholder en oppfatning at behandling av logikk skal håndteres i visninger og ikke i maler, og dermed holder malene rene. En kontekstprosessor blir et praktisk verktøy i dette tilfellet. Vi kan videresende våre verdier til en metode; Dette vil da bli behandlet i en Python-metode, og vår resulterende verdi vil bli returnert. Derfor er vi egentlig bare å legge til en funksjon i malen konteksten (takket være Python for å la oss passere rundt funksjoner akkurat som alle andre objekt).
Så, la oss si at vi vil legge til et beskrivende navn for hvert produkt i formatet Kategori / Produktnavn
. For dette må en metode legges til, som må være dekorert med @ app.context_processor
.
@ app.context_processor def some_processor (): def full_name (produkt): returnere 0 / 1. format (produkt ['kategori'], produkt ['navn']) returnere 'full_name': full_name
Teknisk sett er en kontekst bare en Python-ordbok som kan endres for å legge til og fjerne verdier. Enhver metode med den angitte dekoratøren skal returnere en ordliste som vil oppdatere gjeldende applikasjonskontekst.
For å bruke denne kontekstprosessoren, legg bare til følgende Jinja2-tag i malen.
full_name (produkt)
Hvis vi legger til dette til det flask_app / templates / product.html
av vår søknad, vil det se ut som:
% utvider 'home.html'% % blokkbeholder%% endblock%full_name (produkt)
Produktnavn'] produktkategori']
$ produkt ['pris']
Den resulterende produktsiden vil nå se ut som:
Etter å ha sett på eksempelet ovenfor, kan erfarne utviklere tro at det var dumt å bruke en kontekstprosessor til formålet. Man kan bare skrive et filter for å få det samme resultatet; Dette vil gjøre ting mye renere. Et filter kan skrives for å vise produktets beskrivende navn som vist nedenfor.
@ app.template_filter ('full_name') def full_name_filter (produkt): returnere '0 / 1' format (produkt ['kategori'], produkt ['navn'])
Dette filteret kan brukes som et normalt filter, dvs. ved å legge til en | (rør)
symbol og deretter filternavnet.
produkt | full_name
Ovennevnte filter vil gi det samme resultatet som kontekstprosessoren demonstrert en stund tilbake.
For å ta ting til et høyere nivå, la oss lage et filter som vil formatere valutaen basert på gjeldende nettlesers lokale språk. For dette må vi først installere en Python-pakke som heter ccy
.
$ pip installasjon ccy
Nå må vi legge til en metode for valutafilteret.
importer ccy fra kolbe import forespørsel @ app.template_filter ('format_currency') def format_currency_filter (beløp): currency_code = ccy.countryccy (request.accept_languages.best [-2:]) returnere 0 1. format valuta_kode, beløp)
For å bruke dette filteret må vi legge til følgende i vår mal:
produkt ['pris'] | format_kurver
Nå vil produktsiden se ut som:
Makroer tillater oss å skrive gjenbrukbare biter av HTML-blokker. De er analoge med funksjoner i vanlige programmeringsspråk. Vi kan sende argumenter til makroer som vi gjør for å fungere i Python og deretter bruke dem til å behandle HTML-blokken. Makroer kan bli kalt et hvilket som helst antall ganger, og utgangen vil variere som per logikken inne i dem. Arbeide med makroer i Jinja2 er et veldig vanlig emne og har mange brukssaker. Her vil vi bare se hvordan en makro kan opprettes og deretter brukes etter import.
En av de mest overflødige kodene i HTML er å definere innfelt felt i skjemaer. De fleste feltene har lignende kode med noen modifikasjoner av stil og så videre. Følgende er en makro som lager innfelt felt når det kalles. Den beste fremgangsmåten er å lage makroen i en egen fil for bedre gjenbruk, for eksempel, _helpers.html
:
% makro render_field (navn ,, type = "tekst") -% % - endmacro%
Nå skal denne makroen importeres i filen som skal brukes:
% fra '_helpers.jinja' import render_field%
Deretter kan det enkelt kalles ved å bruke følgende:
Det er alltid en god praksis å definere makroer i en annen fil for å holde koden ren og øke kodelesbarheten. Hvis en privat makro som ikke kan nås ut av den nåværende filen, trengs, så navngi makroen med et understreke foran navnet.
I denne opplæringen har vi sett hvordan du skriver et egendefinert filter, en tilpasset kontekstprosessor og en egendefinert makro for skjemaer. I neste del av denne serien ser vi hvordan du implementerer avansert dato og klokkeslettformatering på malnivå i Jinja2 ved hjelp av moment.js.