2012-06-22 3 views
9

Скажем, я использую return render_template('index.html', users=users). Можно ли получить имя файла внутри шаблона без явной отправки его внутри представления?Как получить имя файла текущего шаблона внутри шаблона Jinja2?

+0

просто интересно: что вы пытаетесь сделать? (заинтересован в ответе) –

+0

I second @JeffTratner. Что ты хочешь делать? – Apalala

+0

Я хочу добавить класс в тело в зависимости от имени файла. Например, если это шаблон «user-details.html», я хочу добавить соответствующий класс для правильного управления им через javascript. –

ответ

5

Если все, что вам нужно, это базовое имя, вы можете использовать {{ self }}, который вернет строку возврата, содержащую базовое имя шаблона, например <TemplateReference 'view.html'>. Вы можете разобрать это с фильтром, например, {{ self | quoted }}

@app.template_filter('quoted') 
def quoted(s): 
    l = re.findall('\'([^\']*)\'', str(s)) 
    if l: 
     return l[0] 
    return None 

Если вам нужен полный путь, например, «/full/path/to/view.html» вы можете создать подкласс шаблона.

+0

Не работает. Когда я попробую ваше решение, эта ошибка возникает: TemplateAssertionError: нет фильтра с именем 'quoted' – renatov

+0

@renatov: Где у вас есть @ app.template_filter ('quoted')? Правильно ли фильтр зарегистрирован в приложении Flask? – PartialOrder

5

Хотя недокументированный, {{ self._TemplateReference__context.name }} предоставит имя шаблона. И есть несколько интересных свойств, которые можно использовать после self._TemplateReference__context.

Вы можете, например, добавить к вашей верхней шаблон базы:

 <meta name="template" content="{{ self._TemplateReference__context.name }}"> 

Так что, глядя на исходный код страницы поможет вам быстро найти соответствующий файл шаблона. Если вы не хотите раскрывать эту информацию, сделайте ее условной для среды тестирования.

Смежные вопросы