如何在包含的文件中使用宏

aWe*_*per 9 jinja2 flask

view.jinja

{% extends "layout/defaultlayout.jinja" %}
{% include('details.jinja') %}
Run Code Online (Sandbox Code Playgroud)

defaultlayout.jinja

{% import 'elements/macros.jinja' as html %}
Run Code Online (Sandbox Code Playgroud)

但我无法在detail.jinja中使用宏html而不重新包含它

Dan*_*ead 10

从您的示例中看,它看起来好像您正在尝试导入macros.jinja,并将用作调用的宏html.它不像那样工作.

宏是在jinja文件中定义的,其中包含名称.

macros.jinja:

{% macro dostuff(x,y,z) %}
    <a href="{{ x }}" title="{{y}}">{{z}}</a>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用导入标记导入整个文件:

{% import "macros.jinja" as macros %}
Run Code Online (Sandbox Code Playgroud)

那么,在你当前的命名空间中,你将拥有macros,它指向macros.jinja文件.要使用dostuff宏,您必须致电macros.dostuff(...).

你需要定义一个名为htmlmacros.jinja 的宏,将macros.jinja导入为macros,然后调用它macros.html(...).

那有意义吗?

  • 引号是必须的:`将“ macros.jinja”作为宏导入。 (4认同)

Nab*_*bin 7

丹尼尔的回答对我没有帮助.我必须导入以下方式

{% from "post_entity.html" import show_post with context %}
Run Code Online (Sandbox Code Playgroud)

这里post_entity.html是包含宏的show_post方法 文件
然后使用以下方式:

{{show_post(post)}}
Run Code Online (Sandbox Code Playgroud)

post是从flask 发送到模板的字典render_template.
macro file文件看起来是这样的:
post_entity.html

{% macro show_post(post) %}
    {{post.photo_url}}
    {{ post.caption }}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,不能不止一次投票,否则我会.如果有人指出为什么添加`with context`修复它会很好 - 以及为什么你应该得到一个错误省略它... (2认同)