В Jinja2, как я могу использовать макросы в сочетании с блочными тегами?

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

Мой базовый шаблон содержит этот код (отредактированный для простоты):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> {% from "foo.html" import macro1, macro2, macro3 %} {% macro base_template(title=none, arg2=none, urls={}, arg3=false) %} <html> <title>{{ title }} | Site.com</title> .... {{ caller() }} .... </html> {% endmacro %} {% block content %}{% endblock %} 

И мои страницы, которые расширяют его, выглядят так:

 {% extends "base.html" %} {% block content %} {% call base_template(title="home", arg2="active", arg3="true") %} (html code here) {% endcall %} {% endblock %} 

Таким образом, в основном все страницы расширяют базу, они называют макрос и передают аргументы этому макросу. Я не совсем понимаю это, но главное, что это позволяет использовать значения по умолчанию и степень гибкости, которая не требует переопределения целого блока: она дает некоторую степень гибкости и мощности. Опять же, это сильно упрощено.

Единственная проблема заключается в том, что это отрицает мою способность использовать блоки. Макросы для гибкости, но с блоками, я могу полностью переопределить что-либо или использовать его содержимое для родителей и добавить к нему, что я не могу сделать с макросами (по крайней мере, я не думаю). Проблема в том, что я не могу обернуть элементы в блоки, иначе они не будут видеть значения в макросе. Например, делая это:

 {% block title %}<title>{{ title }} | Site.com</title>{% endblock %} 

Не получится, потому что будет сказано, что название не определено.

В конечном счете, я ищу способ использовать как силовые, так и организационные аспекты блоков, но все же могу использовать логику и терпение макросов. Если бы кто-нибудь мог мне помочь, как бы я мог решить эту проблему, я был бы очень признателен.

Блоки определяются только на верхнем уровне шаблона. Если вы расширите шаблон, любые значения, установленные в дочернем шаблоне с использованием set тега, будут доступны из шаблона, который он расширяет. Например, если у вас есть шаблон с именем layout.html :

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <title>{{ title }} | Site.com</title> .... {% block content %}{% endblock content %} .... </html> 

И у вас есть этот дочерний шаблон, index.html :

 {% extends "layout.html" %} {% set title = 'Homepage' %} {% block content %} (html code here) {% endblock content %} 

Затем ссылка на title в родительском разрешении будет разрешена на 'Homepage' . Вы можете сделать это с помощью любой переменной. Для того, что вы делаете, я не думаю, что есть необходимость в макросах – если вы воспользуетесь этой функцией и разместите блоки хорошо, вы сможете сделать почти все, что вам нужно сделать в отношении макетов , Я бы посмотрел на некоторые из шаблонов, которые использовал Plurk Solace , написанный одним из авторов Jinja2, если вы хотите получить представление о том, когда использовать различные функции Jinja2.