I den första delen av den här delhandelsserien ser vi hur man lägger ut mallstrukturen i en flaskbaserad applikation med hjälp av Jinja2. Vi såg också hur block kan användas för att utnyttja arvet i mallar. I den här delen kommer vi att täcka hur man skriver ett anpassat filter, en anpassad kontextprocessor och ett makro.
Jag kommer att bygga på den katalogansökan vi skapade i den första delen av denna serie. Först lägger jag till en anpassad Jinja2-kontextprocessor för att visa ett beskrivande namn för varje produkt. Då ska jag skapa ett anpassat Jinja2-filter för att göra samma jobb som den anpassade kontextprocessorn. Då kommer jag att visa hur man skapar ett anpassat Jinja2-makro för vanliga formulärfält.
Ibland kanske vi vill beräkna eller bearbeta ett värde direkt i mallarna. Jinja2 har en uppfattning om att behandling av logik ska hanteras i visningar och inte i mallar, och därmed håller mallarna rena. En kontextprocessor blir ett användbart verktyg i detta fall. Vi kan överföra våra värderingar till en metod; Detta kommer sedan att behandlas i en Python-metod, och vårt resulterande värde kommer att returneras. Därför lägger vi väsentligen bara en funktion till mallkontexten (tack vare Python för att vi ska kunna skicka runt funktioner precis som alla andra objekt).
Så låt oss säga att vi vill lägga till ett beskrivande namn för varje produkt i formatet Kategori / Produktnamn
. För detta måste en metod läggas till, vilket måste vara dekorerad med @ app.context_processor
.
@ app.context_processor def some_processor (): def full_name (product): returnera '0 / 1' format (produkt ['kategori'], produkt ['namn']) returnera 'full_name`: full_name
Tekniskt sett är ett sammanhang bara en Python-ordlista som kan modifieras för att lägga till och ta bort värden. Varje metod med den angivna dekoratören ska returnera en ordlista som skulle uppdatera den aktuella applikationskontexten.
För att använda den här kontextprocessorn, lägg bara till följande Jinja2-tagg i mallen.
full_name (produkt)
Om vi lägger till det här flask_app / mallar / product.html
av vår ansökan skulle det se ut som:
% utökar 'home.html'% % block container%% endblock%full_name (produkt)
produktnamn'] produkt ['kategori']
$ produkt ['pris']
Den resulterande produktsidan skulle nu se ut som:
Efter att ha tittat på ovanstående exempel kan erfarna utvecklare tro att det var dumt att använda en kontextprocessor för ändamålet. Man kan helt enkelt skriva ett filter för att få samma resultat. Detta kommer att göra saker mycket renare. Ett filter kan skrivas för att visa produktets beskrivande namn som visas nedan.
@ app.template_filter ('full_name') def full_name_filter (produkt): returnera '0 / 1' format (produkt ['kategori'], produkt ['namn'])
Detta filter kan användas precis som ett normalt filter, dvs genom att lägga till en | (rör)
symbol och sedan filternamnet.
produkt | fullnamn
Ovanstående filter skulle ge samma resultat som kontextprocessorn visades ett tag tillbaka.
För att ta saker till en högre nivå, låt oss skapa ett filter som formaterar valutan baserat på den aktuella webbläsarens lokala språk. För detta måste vi först installera ett Python-paket som heter CCY
.
$ pip installera ccy
Nu måste vi lägga till en metod för valutafiltret.
importera ccy från flaskimportförfrågan @ app.template_filter (format_currency) def format_currency_filter (mängd): currency_code = ccy.countryccy (request.accept_languages.best [-2:]) returnera 0 1. format valuta_kod, belopp)
För att använda detta filter måste vi lägga till följande i vår mall:
produkt ['pris'] | format_currency
Nu skulle produktsidan se ut:
Makron tillåter oss att skriva återanvändbara bitar av HTML-block. De är analoga till funktioner i vanliga programmeringsspråk. Vi kan skicka argument till makron som vi gör för att fungera i Python och sedan använda dem för att bearbeta HTML-blocket. Makroer kan kallas valfritt antal gånger, och utsignalen varierar enligt logiken inuti dem. Att arbeta med makron i Jinja2 är ett mycket vanligt ämne och har många användningsfall. Här kommer vi bara se hur ett makro kan skapas och sedan användas efter import.
En av de mest redundanta kodstyckena i HTML definierar inmatningsfält i formulär. De flesta fälten har liknande kod med vissa modifieringar av stil och så vidare. Följande är ett makro som skapar inmatningsfält när det kallas. Den bästa praxisen är att skapa makro i en separat fil för bättre återanvändning, till exempel, _helpers.html
:
% makro render_field (namn ,, typ = "text") -% % - endmacro%
Nu ska detta makro importeras i filen som ska användas:
% från '_helpers.jinja' import render_field%
Då kan det helt enkelt ringas med följande:
Det är alltid en bra metod att definiera makron i en annan fil för att hålla koden ren och öka kodläsbarheten. Om ett privat makro som inte kan nås från den aktuella filen behövs, namnge du makroet med ett understreck före namnet.
I den här handledningen har vi sett hur man skriver ett anpassat filter, en anpassad kontextprocessor och ett anpassat makro för formulär. I nästa del av den här serien ser vi hur man implementerar avancerad formatering av datum och tid på mallnivå i Jinja2 med moment.js.