2017-08-22 1 views
0

タイトルで指定されているように、親Jinja2テンプレートで変数セットを子テンプレートに渡す方法について懸念しています。Jinja2のあるテンプレートから別のテンプレートに変数を渡す方法

プロジェクトの構成は以下の通りです:

  • 私はAPIを構築するためにトルネードを使用しています。
  • app.pyスクリプトでは、/parentを クラスParentHandlerに関連付けました。カールGETメソッドを実行すると、クラスParentHandlerget() メソッドが実行され、その結果がparent.htmlresponse(dict)にレンダリングされます。レンダリングされたHTMLコードを の子テンプレートのヘッダとして使用したいので、parent.htmlの最後に、 の子テンプレートからのタグを表示するブロックがあります。
  • app.pyには、'/child'というエンドポイントがクラスChildHanlderに関連付けられていました。カールGETメソッドが実行されると、クラスChildHandlerget()方法は、テンプレートchild.htmlに(辞書である)を実行し、その結果をレンダリングし、child_contentされる(IはChildHandlerParentHandlerresponseが届かないので、ChildHandlerしかレンダリングchild_content)。テンプレートchild.htmlparent.htmlを含んでいるので、私は期待してい挙動は(ParentHandler、ないChildHandlerが提供する辞書responseからの値を持つ)parent.htmlからHTMLコードを表示するために、独自の辞書、child_contentをレンダリングするchild.htmlです。

私は上記のプロセスを実行しようとすると、残念ながら、child.htmlparent.pyからresponseを見つけることができません。ここで

は、コードスニペットです:

app.py

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r'/parent', ParentHandler), 
      (r'/child', ChildHandler) 
     ] 

     jinja_load = Jinja2Loader(os.path.join(PATH, '/templates')) 
     settings = { 
      'template_path': os.path.join(PATH, '/templates') 
      'template_loader': jinja_load 
     } 
     tornado.web.Application.__init__(self, handlers, **settings) 

parent.py

class ParentHandler(tornado.web.RequestHandler): 
    def get(self): 
     response = {"status": "200", "val": "some_value"} 
     try: 
      self.render("parent.html", response=response) 
     except: 
      self.write(response) 

child.py

class ChildHandler(tornado.web.RequestHandler): 
    def get(self): 
     response = {"status": "200", "data": "some_data"} 
     try: 
      self.render("child.html", child_content=response) 
     except: 
      self.write(response) 

parent.html

<div> 
    {% if response['status'] == 200 %} 
     {% set val1 = response.get('val', 0) %} 
     <i>{{ val1 }}</i> 
    {% endif %} 
</div> 
{% block child_content %}{% endblock %} 

のchild.html

{% include 'parent.html' %} 
{% from 'parent.html' import val1 %} 
{% block child_content %} 
<table> 
{% for d in data %} 
    <tr> 
     <td>{{ d }}</td> 
    </tr> 
{% endfor %} 
{% endblock %} 

しかし、私はのchild.htmlをレンダリングしようとすると、私はこのエラーで終わる:

UndefinedError: 'response' is undefined 

は、誰も私を助けてくださいことはできますか?

答えて

1

あなただけそうのように、include文にwithキーワードを追加する必要がありますあなたの場合は

{% include 'parent.html' with var1=value1, var2=value2, ... %} 

{% include 'parent.html' with response=responseValue %} 
+0

私はresponsValをchild.pyから取得していませんが、parent.py:/ 親から子にresponseValueを渡したいと思います。 –

+0

あなたが得ているエラーは、値を持たない親で '' response'''という名前の変数を使用しようとしていることを意味します。これは、標準の継承と非常によく似ています。 '' 'child.html'''をレンダリングするときに' '' parent.html'''をレンダリングしますが、親が実行しようとしているときは '' { 'status'] == 200%} '' '' 'response''は変数が初期化されていないので、値がないことが分かります(エントリポイント、子を通して行う必要があります)。 – Strinnityk

+0

正しく理解できなかった場合は私を修正しますが、 '' 'parent.html'''で生成された値を' '' 'child.html'''に渡そうとしていますか? – Strinnityk

0

私は私のオリジナルのアイデアをあきらめてしまったとして行くことにしました@Strinnitykの解決策。 child.pyの出力を変更し、出力をparent.pyに更新しました。 この方法では、child.htmlテンプレートで変数を使用する必要さえありません。

もう一度おねがいします!

+0

ああ、申し訳ありません、昨日かなり忙しく、助けを続けることができませんでした。それは働いていますか?何か助けてもらえますか? – Strinnityk

+0

ええ、それは解決されました。 ありがとう! –

関連する問題