渲染Jinja2继承

时间:2015-04-05 15:51:21

标签: python-2.7 jinja2

我想在jinja2中使用继承的概念将配置的不同部分分成多个独立的子模板。

最终,让它适用于更复杂的层次结构,例如:

parent.jj2
  |_child1.jj2
  |   |_child11.jj2
  |   |
  |   |_child12.jj2
  |
  |_child2.jj2
      |_child21.jj2
      |
      |_child22.jj2

在这个例子中,我只使用了2个子模板:

parent.jj2模板:

## Main file header
{% block child1 %}{% endblock %}
##
{% block child2 %}{% endblock %}
## Main file tail

child1.jj2模板:

{% extends "parent.jj2" %}
{% block child1 %}
{% for i in list %}
child1 line {{ i }}
{% endfor %}
{% endblock %}

child2.jj2模板:

{% extends "parent.jj2" %}
{% block child2 %}
{% for i in list %}
child2 line {{ i }}
{% endfor %}
{% endblock %}

我使用以下渲染,其中子模板是单独渲染的,但它不会产生所需的结果:

使用过的jinja2 Loader:

list1 = \
    [1,2,3]

list2 = \
    ['a','b','c']

loader = jinja2.FileSystemLoader(os.getcwd())
jenv = jinja2.Environment(loader=loader, trim_blocks=True,lstrip_blocks=True)

template = jenv.get_template('child1.jj2')
print template.render(list=list1)

template = jenv.get_template('child2.jj2')
print template.render(list=list2)

如何以一种方式调用渲染,即我将主模板与子块一起渲染到一个文件中?

期望的结果:

## Main file header
child line1 1
child line1 2
child line1 3
##
child line1 a
child line1 b
child line1 c
## Main file tail

当前结果:

## Main file header
child line1 1
child line1 2
child line1 3
##
## Main file tail

## Main file header
##
child line1 a
child line1 b
child line1 c
## Main file tail

2 个答案:

答案 0 :(得分:0)

我使用 include 来获得所需的结果。

渲染父模板,其中包含所有子模板

<强> parent.jj2:

#Main file header
{% include "child1.jj2" %}
##
{% include "child2.jj2" %}
#Main file tail

<强> child1.jj2

{% block peceinterfaces %}
{% for i in list[0] %}
child1 line1 {{ i }}
{% endfor %}
{% endblock %}

<强> child2.jj2:

{% block pepinterfaces %}
{% for i in list[1] %}
child2 line1 {{ i }}
{% endfor %}
{% endblock %}

渲染父模板:

list1 = \
    [1,2,3]

list2 = \
    ['a','b','c']

loader = jinja2.FileSystemLoader(os.getcwd())
jenv = jinja2.Environment(loader=loader, trim_blocks=True,lstrip_blocks=True)

template = jenv.get_template('parent.jj2')
print template.render(list=[list1,list2])

结果:

#Main file header
child1 line1 1
child1 line1 2
child1 line1 3
##
child2 line1 a
child2 line1 b
child2 line1 c
#Main file tail

答案 1 :(得分:0)

您可以在子模板的顶部使用扩展

{% extends "child1.jj2l" %}