使用python/flask中的twitter bootstrap css更改链接的活动类

Aze*_*rah 31 python class jinja2 flask twitter-bootstrap

我从我的页面获得了以下html片段template.html.

<ul class='nav'>
    <li class="active"><a href='/'>Home</a></li>
    <li><a href='/lorem'>Lorem</a></li>

    {% if session['logged_in'] %}
        <li><a href="/account">Account</a></li>
        <li><a href="/projects">Projects</a>
        <li><a href="/logout">Logout</a></li>
    {% endif %}

    {% if not session['logged_in'] %}
        <li><a href="/login">Login</a></li>
        <li><a href="/register">Register</a></li>
    {% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)

正如你在第2行看到的那样,这个类是活跃的.这突出显示了具有twitter bootstrap css文件的活动选项卡.现在,如果我要访问,这将工作正常www.page.com/但不是我访问时www.page.com/login的情况.它仍然会将主页链接突出显示为活动选项卡.

当然,我可以使用Javascript/jQuery轻松完成此操作,但在这种情况下我宁愿不使用它.

已经有一个工作解决方案为ruby on rails但我不知道如何将其转换为python/jinja(我对jinja/flask很新,从来没有使用ruby)

cod*_*eek 70

你看过这个吗?http://jinja.pocoo.org/docs/tricks/

突出显示活动菜单项

通常,您希望拥有一个带有活动导航项的导航栏.这很容易实现.因为子模板中块之外的赋值是全局的并且在评估布局模板之前执行,所以可以在子模板中定义活动菜单项:

{% extends "layout.html" %}
{% set active_page = "index" %}
Run Code Online (Sandbox Code Playgroud)

然后,布局模板可以访问active_page.另外,定义该变量的默认值是有意义的:

{% set navigation_bar = [
    ('/', 'index', 'Index'),
    ('/downloads/', 'downloads', 'Downloads'),
    ('/about/', 'about', 'About')
] -%}

{% set active_page = active_page|default('index') -%}
...
<ul id="navigation">
    {% for href, id, caption in navigation_bar %}
    <li{% if id == active_page %} class="active"{% endif
    %}><a href="{{ href|e }}">{{ caption|e }}</a>
    </li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

...

  • 这很漂亮,尤其是在看到 ruby​​ 代码之后,这更有意义。我不知道 jinja 甚至可以做到这一点,也感谢您的链接,我确定我现在可以解决这个问题:) (3认同)
  • 当您已经控制了值时,为什么要转义“href”和“caption”(例如“href|e”)? (2认同)
  • 这对我不起作用。我实际上不知道它是如何获取当前页面名称的,所以我将您的代码修改为这样:`{% if request.endpoint == id %}`...其余的代码是相同的。但我很好奇你的片段如何知道端点并进行比较。 (2认同)
  • @adonese 它正在工作,不要忘记在每个模板中设置 active_page,例如:`contacts、about、works` 等。 (2认同)
  • @Nicholas 是对的,这就是我在我的小项目中所做的。这个技巧就像一个冠军。 (2认同)

var*_*run 7

如果菜单遍布页面,这是另一种简单的方法。这种方法使用内联的if语句将活动类打印出来。

<ul>

<li class="{{ 'active' if active_page == 'menu1' else '' }}">
<a href="/blah1">Link 1</a>
</li>

<li class="{{ 'active' if active_page == 'menu2' else '' }}">
<a href="/blah2"> Link 2 </a>
</li>

</ul>
Run Code Online (Sandbox Code Playgroud)

活动班是突出显示

您仍然需要在每个页面上设置变量以对其进行标记

{% extends "master.html" %}
{% set active_page = "menu1" %}
Run Code Online (Sandbox Code Playgroud)

要么

{% set active_page = "menu2" %}
Run Code Online (Sandbox Code Playgroud)

  • 最简单但最好的解决方案! (2认同)

phi*_*web 6

对于jinja/flask/bootstrap用户:

如果您像在博客示例http://getbootstrap.com/examples/blog/ 中那样定义您的导航, 只需将 id 分配给与您的url_for参数匹配的链接,您只需要修改布局模板,其余的就可以了#魔法。

<nav class="blog-nav">
  <a id="allposts"  class="blog-nav-item" href="{{ url_for('allposts')}}">All Posts</a>
  <a id="index"     class="blog-nav-item" href="{{ url_for('index')}}">Index</a>
  <a id="favorites" class="blog-nav-item" href="{{ url_for('favorites')}}">Favorites</a>
</nav>
Run Code Online (Sandbox Code Playgroud)

在您的基本/布局模板的底部添加这个

<script>
  $(document).ready(function () {
  $("#{{request.endpoint}}").addClass("active"); })
</script>
Run Code Online (Sandbox Code Playgroud)

并且正确的元素将被设置为活动状态。

编辑: 如果您的布局包含列表中的元素,如下所示:

<nav class="blog-nav">
  <ul class="nav navbar-nav">
    <li>
        <a id="allposts"  class="blog-nav-item" href="{{ url_for('allposts')}}">All Posts</a>
    </li>
    <li>
        <a id="index"     class="blog-nav-item" href="{{ url_for('index')}}">Index</a>
    </li>
    <li>
        <a id="favorites" class="blog-nav-item" href="{{ url_for('favorites')}}">Favorites</a>
    </li>
  </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

使用parent()函数获取 li 元素而不是链接。

<script>
    $(document).ready(function () {
    $("#{{request.endpoint}}").parent().addClass("active"); })
</script>
Run Code Online (Sandbox Code Playgroud)

  • AJAX 不是必需的。如果您使用 AJAX,那么您可能也没有使用 Jinja。您需要在客户端使用 JavaScript 模板引擎(如 Handlebars)生成 HTML 模板,以正确格式化 AJAX 请求的结果。 (3认同)