Jinja active_page在包含的文件中不起作用

时间:2013-01-17 15:09:06

标签: python templates flask jinja2

所以我有一个工作布局_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>

about.html

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

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

问题在于,由于子模板是全局的并且在评估布局模板之前执行,因此class="selected"未添加header.html,因为{% include 'header.html' with context %}模板在其上下文中没有active_page。 / p>

如果我将header.html内容放在主布局中,一切正常,我怎样才能使用我所拥有的包含和结构来实现这一点?

编辑:

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

3 个答案:

答案 0 :(得分:1)

最简单的解决方法是使用JavaScript(在这种情况下为JQuery):

<强> JQuery的:

var currentPage = window.location.pathname;

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

此函数会将选定的类添加到与当前窗口位置匹配的<a>标记中。

答案 1 :(得分:0)

我就是这样做的:

在我的_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文件的页面上。

答案 2 :(得分:0)

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