如何在 Jinja2 中将变量从一个模板传递到另一个模板
How to pass variables from one template to another in Jinja2
如标题所述,我关心的是如何将 parent Jinja2 模板中的变量集传递给它的 child 模板。
项目配置如下:
- 我正在使用 Tornado 构建一个 API。
- 在
app.py
脚本中,我将端点 /parent
关联到
class ParentHandler
。当执行 curl GET 方法时,get()
class ParentHandler
的方法被执行并呈现其结果,
response
(这是一个字典)到模板 parent.html
。我想将呈现的 HTML 代码用作 header
child 模板,所以在 parent.html
的末尾有一个块
显示来自 child 模板的标签。
- 在
app.py
中,我将端点 '/child'
关联到 class ChildHanlder
。当执行 curl GET 方法时,执行 class ChildHandler
的 get()
方法并将其结果 child_content
(这是一个字典)呈现给模板 child.html
(我没有在 ChildHandler
中得到 ParentHandler
的 response
,所以 ChildHandler
只呈现 child_content
)。模板 child.html
包括 parent.html
,所以我期望的行为是 child.html
显示来自 parent.html
的 HTML 代码(使用字典 response
由 ParentHandler
提供,而不是 ChildHandler
) 并呈现其自己的字典 child_content
。
不幸的是,当我尝试执行上述过程时,child.html
没有从 parent.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
有人能帮帮我吗?
你只需要在 include 语句中添加 with
关键字,如下所示:
{% include 'parent.html' with var1=value1, var2=value2, ... %}
你的情况
{% include 'parent.html' with response=responseValue %}
我最终放弃了最初的想法,决定采用@Strinnityk 的解决方案。
我更改了 child.py
的输出并使用 parent.py
的输出更新了它。
这样,我什至不需要在 child.html
模板中使用变量。
再次感谢!
如标题所述,我关心的是如何将 parent Jinja2 模板中的变量集传递给它的 child 模板。
项目配置如下:
- 我正在使用 Tornado 构建一个 API。
- 在
app.py
脚本中,我将端点/parent
关联到 classParentHandler
。当执行 curl GET 方法时,get()
classParentHandler
的方法被执行并呈现其结果,response
(这是一个字典)到模板parent.html
。我想将呈现的 HTML 代码用作 header child 模板,所以在parent.html
的末尾有一个块 显示来自 child 模板的标签。 - 在
app.py
中,我将端点'/child'
关联到 classChildHanlder
。当执行 curl GET 方法时,执行 classChildHandler
的get()
方法并将其结果child_content
(这是一个字典)呈现给模板child.html
(我没有在ChildHandler
中得到ParentHandler
的response
,所以ChildHandler
只呈现child_content
)。模板child.html
包括parent.html
,所以我期望的行为是child.html
显示来自parent.html
的 HTML 代码(使用字典response
由ParentHandler
提供,而不是ChildHandler
) 并呈现其自己的字典child_content
。
不幸的是,当我尝试执行上述过程时,child.html
没有从 parent.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
有人能帮帮我吗?
你只需要在 include 语句中添加 with
关键字,如下所示:
{% include 'parent.html' with var1=value1, var2=value2, ... %}
你的情况
{% include 'parent.html' with response=responseValue %}
我最终放弃了最初的想法,决定采用@Strinnityk 的解决方案。
我更改了 child.py
的输出并使用 parent.py
的输出更新了它。
这样,我什至不需要在 child.html
模板中使用变量。
再次感谢!