2016-10-09 2 views
0

Я использую Jinja2 для рендеринга моего интерфейса (и python находится на бэкэнд). Каждая страница будет иметь другое изображение на его вершине, как это:Блок-тег внутри url_for() в Jinja2

<header> 
    <img src="static/img/pic1.png"> 
</header> 

Я использовал url_for(), чтобы получить правильный путь моей статической папки:

<header> 
    <img src="{{ url_for('static', filename='img/pic1.png') }}"> 
</header> 

До сих пор, так хорошо , Но я хотел бы поместить блок внутри параметра filename, чтобы я мог повторно использовать код и только перезаписывать имя изображения. Это то, что я пытаюсь:

<header> 
    <img src="{{ url_for('static', filename='{% block img %}img/pic1.png{% endblock %}') }}"> 
</header> 

Но это не работает, это окончательный код, который оказывает Jinja2:

<header> 
    <img src="/static/%7B%25%20block%20img%20%25%7Dimg/pic1.png%7B%25%20endblock%20%25%7D"> 
</header> 

Как вы можете видеть, Jinja2 не признает блок тег как выражение и рассматривает его как строку. Если бы это сработало, я мог бы установить изображение каждой страницы только с помощью этого кода:

{% extends "base.html" %} 
{% block img %}img/pic2.png{% endblock %} 
... 

Не могли бы помочь, пожалуйста? Кстати, сообщение this мне не помогло.

ответ

3

Что вам нужно, это макрос , чтобы определить функцию в вашем шаблоне. Смотрите эту тему в http://jinja.pocoo.org/docs/dev/templates/

{% macro header_img(name) -%} 
    <img src="{{ url_for('static', filename=name) }}"> 
{%- endmacro %} 

Вы можете поместить этот макрос в шаблоне Util и import его на каждой странице.

Используйте следующий синтаксис:

<header>{{ header_img("your_image.jpg") }}</header> 
+0

и как другие страницы будут повторно использовать этот код для создания * IMG/pic2 * для примера? – renatov

+1

Ну, я добавляю ссылки на документ (что очень хорошо) и небольшой пример. –

+0

Спасибо, это сработало, но мне не нужно импортировать, если я только расширяю шаблон с макросом. Если бы вы могли, пожалуйста, разместите пример с примерами без импорта, я выберу ваше сообщение в качестве ответа, чтобы служить для дальнейшей справки. – renatov

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