使用Flask / Jinja2宏来设置活动导航元素

时间:2014-02-24 15:24:00

标签: python css twitter-bootstrap flask jinja2

我正在使用Flask / Jinja2和Bootstrap 3。

我想将class="active"添加到当前导航元素。

这些元素存储在prog_ids

/programme/23022014
/programme/24022014
/programme/25022014

我关注了this one等一些示例,我的HTML代码是:

    <ul class="nav nav-pills ">
    {% for prog_id in prog_ids %}
    {% macro nav_link(endpoint, prog_id) %}
        {% if request.endpoint.endswith(endpoint) %}
        <li class="active">
            <a href="{{ url_for(endpoint) }}">
            <span class="badge pull-right">-</span>
            {{prog_id|strftime_b}}
            </a>
        </li>
    {% else %}
        <li>
            <a href="{{ url_for(endpoint) }}">
            <span class="badge pull-right">-</span>
            {{prog_id|strftime_b}}
            </a>
        </li>
    {% endif %}
    {% endmacro %}
    {% endfor %}
    </ul>

上面的代码有错误吗?因为,它没有显示任何内容。

3 个答案:

答案 0 :(得分:5)

您的代码只是一遍又一遍地定义一个宏,它不会呈现任何内容。避免阅读request.endpoint并使用基本模板来执行此操作。

base.html

<ul class="nav nav-pills">
    <li class="{% block nav_here %}{% endblock %}">Here</li>
    <li class="{% block nav_there %}{% endblock %}">There</li>
    <li class="{% block nav_anywhere %}{% endblock %}">Anywhere</li>
</ul>

{% block content %}{% endblock %}

there.html

{% extends "base.html" %}
{% block nav_there %}active{% endblock %}
{% block content %}
    <blockquote>No matter where you go, there you are.</blockquote>
{% endblock %}

基本导航定义了nav_类中的空li块,子模板将相关的块设置为active。您可以将此扩展到您希望在页面中进行子导航的范围。

答案 1 :(得分:1)

出于某种奇怪的原因,上述解决方案对我来说并不适合。您还必须分为两部分添加代码。

我的简单解决方案。检查端点是否相等。,然后设置为活动。

 <li class="{% if  request.endpoint == "new_message" %}active{% endif %}"><a href="/new_message"><span class="glyphicon glyphicon-leaf"></span> Message</a></li>

答案 2 :(得分:1)

以正确的方式使用Jinja2宏。这真的是一个有用的功能。在这种情况下,您无法正确理解它是如何工作的。这篇文章很有希望解释它。 这是导航菜单的宏。请记住将此宏放在导航菜单代码上方的某处。否则Jinja在需要时不会找到它。

{% macro nav_link(endpoint, name) %}
    {% if request.endpoint.endswith(endpoint) %}
        <li class="active"><a href="{{ url_for(endpoint) }}">{{name}}</a></li>
    {% else %}
        <li><a href="{{ url_for(endpoint) }}">{{name}}</a></li>
    {% endif %}
{% endmacro %}

您必须在模板文件中单独定义此代码块。不要把它放在循环或其他任何地方。当您在模板中的任何位置调用宏时,此代码块将执行并为您提供所需的输出。了解如何使用此宏。 nav-link()就像一个常规功能。在导航栏代码块中调用它。记住你必须先在服务器中定义这些路由。或者你可以在一个单独的html文件中添加这些宏(让我们说macros.html),然后在任何你想要的地方导入任何宏。

<ul class="nav navbar-nav">
    {{ nav_link('home', 'Home') }}
    {{ nav_link('about', 'About') }}
    {{ nav_link('contact', 'Contact Us') }}
</ul>

如果您使用上面提到的macros.html,可以使用以下代码导入宏。

{% from "macros.html" import nav_link with context %}

这是jinja2模板的good tutorial