在index.html中,就在调用几篇博客文章的for循环之前,我定义了一个在这些文章中使用的宏:
<div class="content">
{% macro image(source, caption) %}
<a href="{{ source }}">
<img src="{{ source }}" alt="{{ caption }}">
</a>
<p class="caption">{{ caption }}</p>
{% endmacro %}
{% block content %}
{% for post in content['posts'][-5:] %}
<article>
<a class="heading" href="{{ post['link'] }}">
<h2>{{ post['title'] }}</h2>
</a>
<p class="date">{{ post['date'] | prettydate }}</p>
{{ post['body']}}
<hr class="post">
{% endfor %}
{% endblock content %}
这些帖子是带有 HTML 代码的模板文件。在那里,我这样称呼这个宏:
{{ image('/content/img/image.jpg', 'My Picture') }}
我原本期望使用宏来渲染它,但事实并非如此。上面的表达式按原样呈现,而不是带有标题的图片。
有人可以告诉我我在这里缺少什么吗?
上面不起作用的原因是因为
post['body']
从未通过 Jinja 的渲染器本身传递。为了实现这一点,我可以自己调用渲染的:
macro = """
{% macro image(source, caption) %}
<a href="/content/img/{{ source }}">
<img src="/content/img/{{ source }}" alt="{{ caption }}">
</a>
<p class="caption">{{ caption }}</p>
{% endmacro %}
"""
template = Template(macro+post['body'])
post['body'] = template.render()