2011-12-14 11 views
10

Sto provando, in un modello, a includere un altro che si trova nella stessa cartella. Per fare ciò, sto solo facendo {% import 'header.jinja2' %}. Il problema è che continuo a ricevere un errore TemplateNotFound.Come includere un modello con percorso relativo in Jinja2

mia cartella dei modelli sembra

+ myProject 
| 
+--+ templates 
    | 
    +--+ arby 
    | |-- header.jinja2 
    | |-- footer.jinja2 
    | +-- base.jinja2 
    | 
    +--+ bico 
     |-- header.jinja2 
     |-- footer.jinja2 
     +-- base.jinja2 

Così, quando mi rendo Arby 'base.jinja2' Mi piacerebbe includere 'Arby/header.jinja2' e quando io rendo di bico 'base.jinja2' lo farei piace includere "bico/header.jinja2". Il fatto è che non voglio scrivere il prefisso 'arby /' o 'bico /' nel {% include 'arby/base.jinja2'%}. È possibile?

Grazie

+0

Da quale file sono in esecuzione 'import'? – Blender

+0

da 'arby/base.jinja2'. Vorrei usare {% import 'header.jinja2'%} per includere 'arby/header.jinja2' –

risposta

7

C'è un accenno nel jinja2.Environment.join_path() docstring su sottoclassi Ambiente e l'override del metodo join_path() per supportare import percorsi relativi alla corrente (vale a dire, la genitore argomento join_path) modello.

Ecco un esempio di una tale classe:

class RelEnvironment(jinja2.Environment): 
    """Override join_path() to enable relative template paths.""" 
    def join_path(self, template, parent): 
     return os.path.join(os.path.dirname(parent), template) 
+0

Attenzione - questo non funziona su Windows a causa dei problemi di Jinja 411 e 412 - os.path.dirname e os. path.join userà ''\\'', che FileystemLoader rifiuterà. Assicurati che il risultato sia separato con ''/'' invece di 'os.path.sep'. –

Problemi correlati