有没有办法将变量传递给 Jinja2 父母?

Posted

技术标签:

【中文标题】有没有办法将变量传递给 Jinja2 父母?【英文标题】:Is there a way to pass variables into Jinja2 parents? 【发布时间】:2012-12-24 15:02:59 【问题描述】:

我正在尝试将一些变量从子页面传递给模板。这是我的python代码:

    if self.request.url.find("&try") == 1:
        isTrying = False
    else:
        isTrying = True

    page_values = 
        "trying": isTrying
    

    page = jinja_environment.get_template("p/index.html")
    self.response.out.write(page.render(page_values))

模板:

<html>
  <head>
    <link type="text/css" rel="stylesheet" href="/css/template.css"></link>
    <title> title  | SST QA</title>

    <script src="/js/jquery.min.js"></script>

  % block head %% endblock head %
  </head>
  <body>
    % if not trying %
    <script type="text/javascript">
    // Redirects user to maintainence page
    window.location.href = "construct"
    </script>
    % endif %

    % block content %% endblock content %
  </body>
</html>

和孩子:

% extends "/templates/template.html" %
% set title = "Welcome" %
% block head %
% endblock head %
% block content %
% endblock content %

问题是,我想将变量“trying”传递给父级,有没有办法做到这一点?

提前致谢!

【问题讨论】:

【参考方案1】:

Jinja2 Tips and Tricks 页面上的示例完美地解释了这一点,http://jinja.pocoo.org/docs/templates/#base-template。本质上,如果你有一个基本模板

**base.html**
<html>
    <head>
        <title> MegaCorp -% block title %% endblock %</title>
    </head>
    <body>
        <div id="content">% block content %% endblock %</div>
    </body>
</html>

和一个子模板

**child.html**
% extends "base.html" %
% block title % Home page % endblock %
% block content %
... stuff here
% endblock %

任何python函数调用render_template("child.html")都会返回html页面

**Rendered Page**
<html>
    <head>
        <title> MegaCorp - Home page </title>
    </head>
    <body>
        <div id="content">
            stuff here...
        </div>
    </body>
</html>

【讨论】:

这可能应该被标记为根据问题的框架是正确的答案。 这没有回答问题,即是否可以将变量从子级传递给父级。类似于% extends "base.html" is_trying=True %,然后在父级中读取is_trying【参考方案2】:

我认为您希望在基本布局中突出显示活动菜单,您需要这样的东西

% extends 'base.html' %
% set active = "clients" %

然后使用可以在base.html中使用“active”

【讨论】:

【参考方案3】:

您只需要在扩展模板之前声明该变量,这样扩展模板就可以访问变量trying

% set trying = True %  <----------- declare variable

% extends "/templates/template.html" %
% set title = "Welcome" %
% block head %
% endblock head %
% block content %
% endblock content %

几年后,但希望它可以帮助后来者

【讨论】:

这正是我所需要的。试图为从基本模板派生的任何页面设置全局命名空间,这是使其工作的唯一方法。【参考方案4】:

我不明白你的问题。当您将变量传递给上下文时(就像您尝试所做的那样),这些变量将在子级和父级中可用。 要将标题传递给父级,您必须使用继承,有时与 super 结合使用:http://jinja.pocoo.org/docs/templates/#super-blocks

另请参阅此问题:Overriding app engine template block inside an if

【讨论】:

是的,很抱歉,我已经找到问题所在了。答案很简单——不要。它给我带来了很多问题。 “答案很简单——不要”我通常不使用变量,而是将嵌套块添加到父块中,然后将其填充到子块中。 sscalvo 的答案虽然有效! (对于一些小众案例很有用)

以上是关于有没有办法将变量传递给 Jinja2 父母?的主要内容,如果未能解决你的问题,请参考以下文章

React:将状态从孩子传递到孩子再传递给父母

Vue.js“超出最大调用堆栈大小”错误。将数据从父母传递给孩子失败

将数据从孩子传递给祖父母

将道具从孙子传递给父母

将父母作为孩子传递给函数c ++

将父母道具传递给Vue,js中的插槽