2011-12-14 49 views
10

私は同じフォルダに別のテンプレートを含めるようにテンプレート内で試しています。そうするために、私はただ{% import 'header.jinja2' %}をやっています。問題は、私はTemplateNotFoundエラーが発生し続けることです。Jinja2に相対パスを含むテンプレートを含めるには

マイテンプレートフォルダは、だから私はアービーズ「base.jinja2」をレンダリングするとき、私は「arby/header.jinja2」を含めたいと私はBICOの「base.jinja2」をレンダリングするとき、私は希望

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

のように見えます'bico/header.jinja2'を含めるようにします。 {%include 'arby/base.jinja2'%}に 'arby /'または 'bico /'というプレフィックスを書いてはいけないということです。これは可能ですか?

おかげ

+0

あなたは 'import'を実行しているどのファイルから? 'arby/base.jinja2'の – Blender

+0

'arby/header.jinja2'をインクルードするために{%import 'header.jinja2'%}を使用したい –

答えて

7

環境をサブクラスと(join_pathのすなわち、引数)現在のテンプレートに対してimportパスをサポートするjoin_path()メソッドをオーバーライド約jinja2.Environment.join_path()ドキュメンテーション文字列内のヒントがあります。ここで

は、このようなクラスの例である:

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

ジンジャーが411と412 - os.path.dirnameとosを発行しているため、これはウィンドウでは機能しません。 path.joinはFilesystemLoaderが拒否する '\\ ''を使用します。結果が 'os.path.sep'ではなく' '/' 'で区切られていることを確認してください。 –

関連する問題