Django - блокировать дочерние блоки с циклом в шаблоне

Я новичок в Django, и хотя я знаю, что вы не можете иметь несколько блоков с одним и тем же именем в одном шаблоне (без какого-либо взлома), я ищу способ сделать следующее:

#parent template
{% for item in block %}
 <div>
 <div>
 {% block item %}{% endblock %}
 </div>
 </div>
{% endfor %}


#child template
{% extends "parent_template" %}
{% block item %}
 <p>Foo Goes Here</p>
{% endblock %}

{% block item %}
 <p>Bar Goes Here</p>
{% endblock %}

И так далее, где результат будет выглядеть примерно так:

<div>
 <div>
 <p>Foo Goes Here</p>
 </div>
</div>
<div>
 <div>
 <p>Bar Goes Here</p>
 </div>
</div> ... etc ...

Это не должно быть "конкретно", как указано выше, но что общая идея.

Надеюсь, это имеет смысл.

1 ответ

Я полагаю, что вы решили проблему до сих пор, но если кому-то еще нужно сделать то же самое, я считаю, что самый простой (и, возможно, единственный) способ состоит в том, чтобы извлечь нужные вам детали в отдельный шаблон и включить его в цикл. Например, в вашем случае я бы сделал что-то вроде:

# collection.html
{% for item in block %}
 {% include "item.html" with element=item %}
{% endfor %}
# item.html
<div>
 <div>
 {{element}}
 </div>
</div>

Основными недостатками здесь являются производительность (что может быть или не быть проблемой), и тот факт, что вам может потребоваться расширить два разных шаблона, когда вам нужно изменить внутренние биты, потому что вам нужно изменить все, что входит в комплект. Конечно, вы можете позаботиться об этом, используя переменную, чтобы решить, какой шаблон item.html вы хотите включить, например:

{% include item_template with element=item %}

licensed under cc by-sa 3.0 with attribution.