【问题标题】:In Jinja2, how can I use macros in combination with block tags?在 Jinja2 中,如何将宏与块标签结合使用?
【发布时间】:2011-01-07 11:28:09
【问题描述】:

我是一名前端开发人员,我一直在努力有效地使用 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 %}

会失败,因为它会说标题未定义。

最终,我正在寻找一种方法来利用块的功能和组织方面,但仍然能够利用宏的逻辑和简洁性。如果有人可以帮助我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: python django templates django-templates jinja2


    【解决方案1】:

    块只能在模板的顶层定义。如果您扩展模板,则使用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'。您可以使用任何类型的变量来执行此操作。对于您正在做的事情,我认为不需要宏-如果您利用此功能并很好地放置块,就布局而言,您几乎可以做所有需要做的事情.如果您想了解何时使用 Jinja2 的各种功能,我会查看 Plurk Solace 使用的一些模板,该模板由 Jinja2 的作者之一编写。

    【讨论】:

    • 我现在就试试这个,不管好不好用,感谢帮助,非常感谢。肯定会查看您提供的 bitbucket 链接。
    • 哇,你完全不知道这对我有多大帮助。我现在可以使用块作为主覆盖,但是我在整个基础中设置了变量,我可以设置一个字典来覆盖其中的任何一个,这正是我想要的。感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多