Jinja - 是否有内置变量可以获取当前HTML页面名称?

22

我非常新手Jinja和Flask。

我想在导航栏中设置不同的背景颜色来指示当前页面。

是否有任何内置的Jinja变量或方法可返回当前HTML页面?如果可能,我希望代码不需要与Python文件通信。

因此,如果我当前在index.html中,则它将返回"index"或"index.html"

这是我的模板中的导航代码:

<ul>
   {% for item in navigation %}
       <a href="{{url_for(item.route)}}">
       <li>
           {{item.text}}
       </li>
       </a>
   {% endfor %}
</ul>
我想添加一个if语句,这样当前页面将获取具有class属性的
  • {% if ??? %}
       <li class="current">
       ...
       </li>
    {% else %}
       ...
    {% endif %}
    

    谢谢您


  • 2
    可能是 https://dev59.com/Gmgu5IYBdhLWcg3wrY0l 的重复问题。 - Hubro
    3个回答

    39

    对于你的问题,在jinja2文档中有一个技巧:http://jinja.pocoo.org/docs/tricks/

    如果你的列表足够简单,只需使用请求对象,类似这样:

    <li {% if request.endpoint == item.endpoint %} class='active' {% endif %}>
        <a href="{{url_for(endpoint)}}">{{item.text}}</a>
    </li> 
    

    通常我会将这段代码编写为一个宏,通过显式参数来设置active:

    {% macro render_sitem(endpoint, display, cls='', icon-cls='', active='') %}
    <li {% if request.endpoint == endpoint or active == endpoint %} class='active' {% endif %}>
        <a class='{{cls}}' href="{{url_for(endpoint)}}"><i class="{{icon-cls}}"></i> {{display}}</a>
    </li>
    {% endmacro %}
    
    列表应该长这样:
     <ul class="nav nav-list">
         {{render_sitem('page.index',  _('Pages'), icon-cls='icon-sitemap', active=active_page)}}
         {{render_sitem('post.index', _('Posts'), icon-cls='icon-file', active=active_page)}}
         {{render_sitem('user.index', _('Users'), icon-cls='icon-group', active=active_page)}}
     </ul>
    

    如果您有一个扩展或包含列表的子页面,您可以设置活动项,例如:

    {% set active_page = 'page.index' %} 
    
    在你的子页面顶部。

    5
    在Pyramid 1.5中,没有像Flask中的request.endpoint这样的方法。我们使用自定义过滤器get_endpoint:
    request.path|get_endpoint
    jinja2_custom_filters.py:
    from pyramid_jinja2 import Environment
    
    def get_endpoint(str):
        """
    
        :param str:
        :return:
        """
        return str.split('/')[-1]
    
    
    env = Environment()
    env.filters['get_endpoint'] = get_endpoint
    

    在 development.ini 文件中:

    jinja2.filters =
        model_url = pyramid_jinja2.filters:model_url_filter
        route_url = pyramid_jinja2.filters:route_url_filter
        static_url = pyramid_jinja2.filters:static_url_filter
        get_endpoint = path to ... jinja2_custom_filters.get_endpoint
    

    也许对某些人有用 :)

    1
    在Flask 2.0.1中,模板中可用request对象。使用request.path属性,您可以轻松检查页面。
    例如,检查代码如下:
    {% if request.path == "/" %}
      <h1>You are at the root</h1>
    {% endif %}
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接