python - Jinja2 中如何将变量从一个模板传递到另一个模板

标签 python jinja2 tornado

如标题所示,我关心的是如何将父 Jinja2 模板中设置的变量传递给其子模板。

项目的配置如下:

  • 我正在使用 Tornado 构建 API。
  • app.py脚本中,我关联了端点 /parent到 类ParentHandler 。当执行curl GET方法时,get() 类的方法ParentHandler被执行并呈现其结果, response (这是一个字典)到模板 parent.html 。我想使用渲染的 HTML 代码作为标题 子模板,所以在 parent.html 的末尾,有一个 block 显示子模板中的标签。
  • app.py ,我关联了端点 '/child'上课ChildHanlder 。当执行curl GET方法时,get()类的方法ChildHandler执行并呈现其结果,child_content (这是一个字典)到模板 child.html (我没有在 ParentHandler 中得到 responseChildHandler ,因此 ChildHandler 仅渲染 child_content )。模板child.html包括parent.html ,所以我期望的行为是 child.html显示 parent.html 中的 HTML 代码(使用 response 提供的字典 ParentHandler 中的值,而不是 ChildHandler )并渲染自己的字典 child_content

不幸的是,当我尝试执行上述过程时,child.html找不到response来自parent.py .

这是一个代码片段:

应用程序.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)

父级.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)

父级.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

有人可以帮我吗?

最佳答案

您只需将 with 关键字添加到 include 语句中,如下所示:

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

就你的情况

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

关于python - Jinja2 中如何将变量从一个模板传递到另一个模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45812272/

相关文章:

python - Tornado :将字符串数据传递给渲染页面中的 JavaScript 代码

python - 如何使用 Tornado 设置自定义服务器 header ?

python - 如何使用 App Engine 获取 Jinja2 中继承模板的特定回溯?

Ansible如何对来自多个节点的命令输出进行排序

python - 在 flask HTML 模板中运行 python 模块

python - pyqt5调用函数没有给出相同的结果

python - Python Tornado 的 Defacto 项目模板

python - if 字符串在行和下一行

python - for in a parameter function python - zip dynamic

python - 如何使用 Python cmd shell 捕获 ctrl+c