Подтвердить что ты не робот

Jinja - Есть ли встроенная переменная для получения текущего имени HTML-страницы?

Я очень новичок в Jinja and 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, чтобы текущая страница получала <li> с class

{% if ??? %}
   <li class="current">
   ...
   </li>
{% else %}
   ...
{% endif %}

Спасибо

4b9b3361

Ответ 1

В документе 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' %} 

в верхней части вашей дочерней страницы.

Ответ 2

В пирамиде 1.5 нет такого метода, как request.endpoint в Flask.

Мы используем собственный фильтр 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

Может быть, кому-то это будет полезно:)