Django模板:在同一个模板中扩展一个块?

时间:2018-03-11 12:58:37

标签: django

所以这里是设置(这里简化):

在我的模板文件中,我有两个部分,我想通过循环一个字典列表来添加内容,例如:

<div class="stuff-a"></div>
<div class="stuff-b"></div>


{% for thing in list %}
  <!-- goes into div a -->
  <!-- goes into div b -->
{% endfor %}

我认为这样可行:

<div class="stuff-a">
    {% block diva %}{% endblock %}
</div>
<div class="stuff-b"> 
    {% block divb %}{% endblock %}
</div>


{% for thing in list %}
  {% block diva %} thing.stuff_for_div_a {% endblock %}
  {% block divb %} thing.stuff_for_div_b {% endblock %}
{% endfor %}

然后django抱怨我不止一次使用每个块 - 对我很羞耻。

现在解决方法(保持相同的模式)是制作一个中间模板文件然后扩展它。

我的问题是,有没有办法在django模板中附加到不同的特定区域,而不必循环遍历列表两次或中间模板文件?

如果循环有点复杂并且您不希望每次进行更改时都需要更新两个循环,这就很重要。

在实践中何时会发生这种情况(在此示例之外)?如果你有一个列表,列表中的每个元素都引用另一个列表(例如bootstrap处理tabnation的方式)

1 个答案:

答案 0 :(得分:1)

  

现在解决方法(保持相同的模式)是制作一个中间模板文件然后扩展它。

您无法执行此操作,因为您无法在循环中使用{% block %},原因相同,因为您可以在同一模板中多次使用某个块。

  

我的问题是,有没有办法在django模板中附加到不同的特定区域,而不必循环遍历列表两次或中间模板文件?

不,你不能。如果你能做到你想要实现的目标,它必然会在幕后的列表中循环两次。

  

如果循环有点复杂并且您不希望每次进行更改时都需要更新两个循环,这就很重要。

如果循环是一个生成器,在每次迭代时计算下一个元素,那么确实很重要。但是在这种情况下,你无法在迭代上循环两次,这是必要的。

如果它是已经计算并存储在内存中的列表,则无关紧要。

  

在实践中何时会发生这种情况(在此示例之外)?如果你有一个列表,列表中的每个元素都引用另一个列表(例如bootstrap处理tabnation的方式)

我不知道这会如何复杂。