Flask 和 jinja2 的 include 标签

2 投票
1 回答
2998 浏览
提问于 2025-04-17 15:14

如何在jinja2中使用“include标签”。我需要在基础模板中输出一块文章内容,并且这些内容在子模板中也能使用。

views.py

Articles.query.filter_by(name=name).first()

base.html

{% block content %}
    Content base
{% endblock %}
---{{ this_articles_tag }}----

children.html

{% extends 'base.html' %}
{% block content %}
    Content children
{% endblock %}
---{{ output Articles }}----

在Django中,这个“include标签”,在jinja2中该怎么做呢?(不使用context_processor)

1 个回答

2

如果你想在一个模板里包含另一个模板,可以在Jinja中使用include。不过如果你说的是模板标签(在Django中我记得我很喜欢这些),那么在Flask中,只有你提到的上下文处理器是可行的。我觉得这其实也没什么不好。

编辑:

注册上下文处理器作为函数的最简单方法可以在文档中找到。

但如果你想要一些更高级的功能,比如动态加载,或者你想从不同的地方加载你的函数,那么你可以定义自己的装饰器函数,这个函数基本上是用来包装返回字典的函数:

def example_templatetag():
  def get_something():
    return get_want_you_want_from_db()
  return dict(get_something=get_something)

然后在你创建Flask应用对象的地方,你可以很容易地注册这个函数:

app.context_processor(example_templatetag)

接着在模板中你可以这样使用:

{% set data_you_wanted=get_something() %}
{{ data_you_wanted }}

不过也许对你来说,文档中提到的方法就已经足够了;)

撰写回答