【问题标题】:Jinja active_page not working when within an included fileJinja active_page 在包含的文件中不起作用
【发布时间】:2013-01-17 15:09:06
【问题描述】:

所以我有一个工作布局 _layout.html(使用 Jinja2 v2.6 和 Flask),其中包括带有 {% include 'header.html' %} 的标题和带有 {% block content %}{% endblock %} 的正文内容(按此顺序)。

header.html

<ul>
    <li><a href="/about" {% if active_page == 'about' %} class="selected" {% endif %}>ABOUT</a></li>
</ul>

关于.html

{% extends "_layout.html" %}
{% set active_page = 'about' %}

{% block content %}
    ...
{% endblock %}

问题在于,由于子模板是全局的,并且在评估布局模板之前执行,因此 class="selected" 没有被添加,因为 header.html 模板在其上下文中没有 active_page。

如果我将 header.html 内容放在主布局中一切正常,我如何使用我拥有的包含和结构使其工作?

编辑:

我也试过{% include 'header.html' with context %}{% from 'header.html' import input with context %} 都不起作用。

【问题讨论】:

  • 你可以把header是一个block,或者看看super。
  • 我不确定这是不是答案,因为我真的需要这是一种包含,这样我就可以在站点周围使用 header.html,同时保持我拥有的结构。我认为它可以创建自定义块?
  • 看看这个答案:stackoverflow.com/questions/13137628/…。并在需要时使用它来覆盖您孩子中的基本标头。
  • 正如documentation 所说:Starting with Jinja 2.2 you can explicitly specify that variables are available in a block by setting the block to “scoped” by adding the scoped modifier to a block declaration

标签: python templates flask jinja2


【解决方案1】:

最简单的解决方法可能是只使用 JavaScript(在本例中为 JQuery):

jQuery:

var currentPage = window.location.pathname;

$('nav ul li a').each(function(){
    if($(this).attr('href') == currentPage){
        $(this).addClass('selected');
    }
});

这个函数会将一个选定的类添加到与当前窗口位置匹配的&lt;a&gt; 标记中。

【讨论】:

    【解决方案2】:

    这就是我的做法:

    在我的 _mainlayout 中

     {% block stylesheets %}
        Links to stylesheets go here
     {% endblock %}
    
     {% block main_body_area %}
            Replace with your html body
     {% endblock %}
    
     {% block scripts %}
        Add js scripts here
     {% endblock %}
    

    然后在子模板中简单地执行以下操作:

    {% extends "_mainlayout.html" %}
    
     {% block stylesheets %}   
        <style sheets go here/>
     {% endblock %}
    
     {% block main_body_area %}
        <your page content here/>
     {% endblock %}
    
     {% block scripts %}
        add any js scripts here
     {% endblock %}
    

    然后,您可以在 head 部分添加您的 active_page,在我给您的示例中,我保存样式表。我这样做是因为在我的 _mainlayout 文件中,我有一个标准的 css 样式表,它用于所有页面,然后如果我需要其他特定页面的布局,我会将它包含在该特定页面中,如果不只是将其留空。

    js 文件也是如此,我不想在不需要它们的页面上加载脚本,因此可以轻松地将它们包含在需要特定 js 文件的页面上。

    【讨论】:

    • 感谢您的回答,您认为这可以使用包含来完成吗?
    • 好的,所以我尝试了几个小时,但没有成功!我会在早上以更新鲜的心态尝试一下!
    • 谢谢你,感谢你的努力,我已经坚持了几天了。必须有一个解决方法!
    【解决方案3】:

    我刚刚在 Jinja2 版本 2.8 中遇到了同样的问题。将其升级到 2.9 版 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多