【问题标题】:How to pass variables from one template to another in Jinja2如何在 Jinja2 中将变量从一个模板传递到另一个模板
【发布时间】:2018-01-30 10:09:55
【问题描述】:

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

项目的配置如下:

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

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

这是一个代码sn-p:

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)

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

谁能帮帮我?

【问题讨论】:

    标签: python jinja2 tornado


    【解决方案1】:

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

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

    你的情况

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

    【讨论】:

    • 问题是我没有从 child.py 获得 responsValue,而是从 parent.py 获得:/ 我想将 responseValue 从父母传递给孩子。
    • 您得到的错误意味着您试图在父级中使用名为 response 的变量,而它没有值。这与标准继承非常相似,当您渲染child.html 时,您也渲染parent.html,但是当父尝试执行时:{% if response['status'] == 200 %} 它发现response 没有值,因为变量尚未初始化(这必须通过入口点,孩子来完成)。
    • 如果我没有正确理解,请纠正我,但是您是否试图将parent.html 中生成的一些值传递给child.html
    • 是的,没错,我正在尝试将parent.html 中生成的值传递给child.html。但如果我理解你之前的评论,唯一的办法就是在child.py 中初始化response 吗?
    • 关于 response 值问题,如果您的函数呈现模板 child.html 并且它包含 parent.html 如果您想将参数发送到 parent.html 您需要按照我显示的方式发送它们上面的答案。虽然如果 response 变量是从渲染函数上下文参数发送的,我相信每个包含的模板都可以访问它。至于第二个问题,我将展开答案。
    【解决方案2】:

    我最终放弃了最初的想法,决定采用@Strinnityk 的解决方案。 我更改了child.py 的输出并用parent.py 的输出更新了它。 这样,我什至不需要在 child.html 模板中使用变量。

    再次感谢!

    【讨论】:

    • 哦,对不起,昨天很忙,没能继续帮忙。它在工作吗?有什么可以帮你的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多