В 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 %}

Потерпит неудачу, потому что это скажет, что название не определено.

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

10
задан Rey 20 January 2010 в 21:03
поделиться

1 ответ

Блоки определены только на верхнем уровне шаблона. Если вы продлите шаблон, любые значения, установленные в шаблоне ребенка с использованием метка , будут доступны из шаблона, который простирается. Например, если у вас есть шаблон с именем 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 %}

Тогда ссылка на У родителя разрешится до домашней страницы ». Вы можете сделать это с любым типом переменной. Для того, что вы делаете, я не думаю, что есть какие-либо потребности в макросах - если вы используете преимущества этой функции и размещения блоков хорошо, вы сможете сделать в значительной степени все, что вам нужно сделать, насколько это касается макета. Отказ Я бы посмотрел на некоторые шаблоны, используемые Plurk Place , который написан одним из авторов Jinja2, если вы хотите получить хорошее представление о том, когда использовать различные функции Jinja2.

20
ответ дан 3 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: