我正在使用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>
上面的代码有错误吗?因为,它没有显示任何内容。
答案 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。