Templierea cu Jinja2 în balon Avansat

În prima parte a acestei serii tutorial în trei părți, am văzut cum să prezentăm structura șablonului într-o aplicație bazată pe Flask utilizând Jinja2. De asemenea, am văzut cum pot fi folosite blocurile pentru a mobiliza moștenirea în șabloane. În această parte vom descrie modul de scriere a unui filtru personalizat, a unui procesor de context personalizat și a unei macrocomenzi.

Noțiuni de bază

Voi construi o aplicație de catalog pe care am creat-o în prima parte a acestei serii. Mai intai voi adauga un procesor custom Jinja2 pentru a arata un nume descriptiv pentru fiecare produs. Apoi, voi crea un filtru Jinja2 personalizat pentru a face același job ca procesorul de context personalizat. Apoi, voi demonstra cum să creați o macrocomandă Jinja2 personalizată pentru câmpurile formularului obișnuit.

Crearea unui procesor de context Jinja2 personalizat

Uneori, este posibil să dorim să calculam sau să procesăm o valoare direct în șabloane. Jinja2 menține o noțiune că prelucrarea logicii ar trebui să fie tratată în vizualizări și nu în șabloane, și astfel, păstrează șabloanele curate. Un procesor de context devine un instrument util în acest caz. Putem trece valorile noastre într-o metodă; aceasta va fi apoi procesată într-o metodă Python, iar valoarea rezultantă va fi returnată. Prin urmare, suntem, în esență, doar adăugând o funcție în contextul șablonului (datorită faptului că Python ne permite să trecem prin funcții la fel ca orice alt obiect).

Deci, să presupunem că dorim să adăugăm un nume descriptiv pentru fiecare produs în format Categorie / Denumire produs. Pentru aceasta, trebuie adăugată o metodă, care trebuie să fie decorate cu @ app.context_processor.

@ app.context_processor def unele_procesor (): def nume_plul produs: return 0 / 1 '.

Din punct de vedere tehnic, un context este doar un dicționar Python care poate fi modificat pentru a adăuga și elimina valori. Orice metodă cu decoratorul specificat ar trebui să returneze un dicționar care să actualizeze contextul aplicației actuale.

Pentru a utiliza acest procesor de context, trebuie doar să adăugați următoarea etichetă Jinja2 în șablon.

nume complet produs

Dacă adăugăm asta la asta flask_app / template-uri / product.html din aplicația noastră, ar arata ca:

% extinde 'home.html'% % bloc container% 

nume complet produs

numele produsului'] Categorie produs']

$ produs ['preț']

% endblock%

Pagina de produs rezultată va arăta acum:

Crearea unui filtru personalizat Jinja2

După examinarea exemplului de mai sus, dezvoltatorii cu experiență ar putea crede că a fost proastă utilizarea unui procesor de context în acest scop. Se poate scrie simplu un filtru pentru a obține același rezultat; acest lucru va face lucrurile mult mai curate. Un filtru poate fi scris pentru a afișa numele descriptiv al produsului, după cum se arată mai jos.

@ app.template_filter ('full_name') def full_name_filter (produs): întoarcere '0 / 1' format (produs ['categorie'], produs [

Acest filtru poate fi folosit ca un filtru normal, adică prin adăugarea unui filtru | (Pipe) simbol și apoi numele filtrului.

produs | nume complet

Filtrul de mai sus ar avea acelasi rezultat ca procesorul de context a demonstrat un timp inapoi.

Pentru a face lucrurile la un nivel mai înalt, să creăm un filtru care să formateze moneda pe baza limbii locale a browserului curent. Pentru aceasta, mai întâi trebuie să instalați un pachet Python numit CCY.

$ pip instalare ccy

Acum trebuie să adăugăm o metodă pentru filtrul valutar.

import ccy din cererea de import al flaconului @ app.template_filter ('format_currency') def format_currency_filter (sumă): currency_code = ccy.countryccy (request.accept_languages.best [-2:]) return 0 1 currency_code, amount)

Pentru a utiliza acest filtru, trebuie să adăugăm următoarele în șablonul nostru:

produs ['preț'] | format_currency

Acum, pagina de produs ar arata astfel:

Crearea unui macro Jinja2 Custom pentru Formulare

Macroanele ne permit să scriem bucăți reutilizabile de blocuri HTML. Acestea sunt similare cu funcțiile din limbile de programare obișnuite. Putem transfera argumente la macro-uri ca și noi în funcții în Python și apoi să le folosim pentru a procesa blocul HTML. Macroanele pot fi numite de mai multe ori, iar ieșirea va varia în funcție de logica din interiorul lor. Lucrul cu macro-urile din Jinja2 este un subiect foarte comun și are o mulțime de cazuri de utilizare. Aici vom vedea cum poate fi creată o macrocomandă și apoi utilizată după import.

Una dintre cele mai redundante bucăți de cod din HTML este definirea câmpurilor de intrare în formulare. Majoritatea câmpurilor au un cod similar cu unele modificări de stil și așa mai departe. Următoarea este o macrocomandă care creează câmpuri de introducere atunci când este sunată. Cea mai bună practică este de a crea macrocomanda într-un fișier separat pentru o reutilizare mai bună, de exemplu, _helpers.html:

% macro render_field (nume, tip = "text") -%  % - endmacro%

Acum, această macrocomandă ar trebui importată în fișierul care va fi utilizat:

% din '_helpers.jinja' import render_field%

Apoi, poate fi pur și simplu apelat folosind următoarele:

render_field ("nume de utilizator", "pictogramă-utilizator") render_field ("parola", "pictogramă", tip = "parola")

Este întotdeauna o practică bună să definiți macrocomenzile într-un fișier diferit, astfel încât să păstrați codul curat și să creșteți citirea codului. Dacă este necesară o macrocomandă privată care nu poate fi accesată din fișierul curent, atunci denumiți macro-ul cu un subliniere care preced numele.

Concluzie

În acest tutorial, am văzut cum să scriem un filtru personalizat, un procesor de context personalizat și o macrocomandă personalizată pentru formulare. În următoarea parte a acestei serii, vom vedea cum să implementăm formatarea avansată a datei și a timpului la nivelul șablonului din Jinja2 folosind moment.js.

Cod