2012-03-19 9 views
6

Diciamo solo che ho bisogno di rendere una certa quantità di HTML più e più volte in una pagina, ad esempio, per le informazioni del profilo di un utente. Le macro di Jinja sembrano essere assolutamente adatte per tale uso. Tuttavia, Django non ha macro.Quale sarebbe un equivalente appropriato dei macro di Jinja nel sistema di template di Django?

In questo momento, sto utilizzando un filtro personalizzato per lo stesso scopo: è questo il modo migliore per farlo o mi manca qualcosa?

Grazie.


ps. Sto eseguendo la migrazione di un'app che è stata eseguita su GAE con webapp2 & da Jinja a Django.

+0

Jinja estende i modelli di Django per aggirare alcuni dei limiti del sistema di modelli di Django. il tag di blocco della macro è qualcosa che è specifico di jinja. L'unico modo per emularlo è attraverso (come hai detto) tag e filtri personalizzati, e talvolta questi possono diventare piuttosto ingombranti. –

risposta

7

Dopo un po 'di pulizia con la documentazione, ho finalmente trovato il "correct" way to do this: custom inclusion tags, che consente di creare un tag da un modello.

+2

Puoi semplicemente usare jinja, se vuoi. – Marcin

+2

Questo link è morto. Eccone uno nuovo: https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/#inclusion-tags – fluffels

2

Esistono altri due approcci che è possibile adottare: blocks e includes. Con i blocchi dovresti includerlo per tutta la lunghezza dell'eredità. Con include, ti basta caricare come necessario ma devi assicurarti di passare le variabili di contesto appropriate dalla tua vista. Tuttavia, il tuo approccio attuale è probabilmente il più utile in termini di DRY.

+0

Grazie; Volevo solo confermare. C'è qualche ragione particolare per cui Django non ha raccolto macro da Jinja? – aviraldg

+0

@aviraldg Il sistema di template di Django non ha un design potente. – Marcin

1

Django non ha macro, quindi è un filtro personalizzato, o separa il codice ripetuto nel proprio modello, e lo include più volte con diversi argomenti passati attraverso "con", che probabilmente funzioneranno più lentamente dei macro. Ma puoi usare il sistema di jinja2 templating con django perfettamente bene.

0

Solo per la cronaca, in realtà ho speso un bel po 'di tempo adattando uno snippet preesistente per fare macro in django in un modo abbastanza robusto, se davvero vuoi le macro per favore check it out.

Come consiglio, la maggior parte delle volte cosa si vuole fare con una macro, si dovrebbe fare davvero con un tag include, come detto; tuttavia, a volte vuoi solo una macro e per questo devi usare una libreria di tag template come la mia (che è una delle poche che fanno questo per django).

Problemi correlati