【问题标题】:Multiple blocks of same name in Jinja2Jinja2中的多个同名块
【发布时间】:2010-11-17 13:17:07
【问题描述】:

Jinja2,我有一个这样的基本模板:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {% block title %}{% endblock %} - example.com
</h1>

然后,Jinja2 失败并显示以下消息:

  lines = [self.message, '  ' + location]
: block 'title' defined twice

现在必须清楚我要做什么 - 在两个地方有相同的标题:TITLE 标签和 H1 标签,但标题的一部分实际上是由其他派生模板提供的。

通常如何实现这一目标?

【问题讨论】:

    标签: python html templates jinja2


    【解决方案1】:

    正如 here 所记录的,定义一个块会创建一个宏,该宏在特殊的“self”对象中具有块的名称:

    <title>{% block title %}{% endblock %} - example.com</title>
    [...]
    
    <h1> 
      {{ self.title() }} - example.com
    </h1>
    

    【讨论】:

      【解决方案2】:

      这个想法是在宏内创建一个块,然后调用宏两次,而不是让“块”标签重复两次。

      在最新的 Jinja2 版本中这有效:

      layout.html

      {%- extends "base.html" -%}
      
      {%- macro duplicated() -%}
          {% block overrideninchild %}{% endblock %}
      {%- endmacro -%}
      
      {% block base_content %}
          {{ duplicated() }}
          {{ duplicated() }}
      {% endblock %}
      

      child_page.html

      {%- extends "layout.html" -%}
      
      {% block overrideninchild %}
         Should be visible twice.
      {% endblock %}
      

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 2013-09-27
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        相关资源
        最近更新 更多