如何在Jinja2中使用变量来重复某些块

时间:2019-05-27 10:05:07

标签: python html flask jinja2

0 /我的问题

使用Jinja2和Flask(对于python3.7),我想创建带有for循环或带有__init__方法的块。可能吗?

1 /背景

使用Jinja2 / Flask重复代码块的方法可能是:

<!-- here is my block  -->
{% block myBlock %}
  <div class="myClass" >
    <p>{{ myText }}</p>
  </div>
{% endblock myBlock %}


<!-- let's repeat !  -->
{% for i in range(10) %}
  {{self.myBlock()}}
{% endfor %}

好的,但是如果我要3个块,3个类和3个文本,则需要编写如下内容:

{% block myBlock1 %}
  <div class="myClass1" >
    <p>{{ myText1 }}</p>
  </div>
{% endblock myBlock1 %}

{% block myBlock2 %}
  <div class="myClass2" >
    <p>{{ myText2 }}</p>
  </div>
{% endblock myBlock2 %}

{% block myBlock3 %}
  <div class="myClass3" >
    <p>{{ myText3 }}</p>
  </div>
{% endblock myBlock3 %}

显然这不是一个好方法,所以我的问题是:如何分解此代码?

2 /预期结果/解决方案

1st

是否可以这样写:

{% set my_list = [("myClass1", "myBlock1", "myText1"),
                  ("myClass2", "myBlock2", "myText2"),
                  ("myClass3", "myBlock3", "myText3")] %}

{% for _class, _block, feature in my_list %}
  {% block _block %}
    <div class="{{ _class }}" >
      <p>{{ feature }}</p>
    </div>
  {% endblock _block %}
{% endfor %}

当然不会起作用:_classfeature将被视为变量,而不是_block。 有什么可能的吗?

第二

关于我们的第一个示例,是否有一种方法可以在我们的{{ self.myBblock() }}处传递变量以获取{{ self.myBlock(_class="MyClass", _name="MyBlockName", text="Mytext") }}? 因为如果可能的话,我们可以定义一个“块通用结构”,并且可以很容易地做到:

{% set my_list = [("myClass1", "myBlock1", "myText1"),
                  ("myClass2", "myBlock2", "myText2"),
                  ("myClass3", "myBlock3", "myText3")] %}

{% for _class, _block, feature in my_list %}
  {{ self.myBlock(_class="_class", _name=_block, text=feature) }} 
{% endfor %}

感谢您的帮助!

0 个答案:

没有答案