Django: возможно использовать переменную из родительского цикла для дочернего оператора if

Можно ли использовать переменную из родительского цикла for в дочернем операторе if?

Вот пример:

{% for ruleset in rulesets %}
  <div>{{ ruleset.0 }}</div>
  <ul>
    {% for rule in rules %}
      {% if rule.0 = {{ ruleset.0 }} %}
        <li>{{ rule.1 }}</li>
      {% else %}
        <!-- Nothing -->
      {% endif %}
    {% endfor %}
  </ul>
{% endfor %}

Ошибка, которую я получаю: поднять TemplateSyntaxError("Не удалось проанализировать остаток: '%s' от '%s'" % (token[upto:], token)) TemplateSyntaxError: Не удалось проанализировать остаток: '{{' от '{{'

Что, я полагаю, означает, что он не мог понять {{ ruleset.0 }} в операторе if. Любые предложения относительно того, как решить эту проблему?


person kd1978    schedule 26.03.2014    source источник


Ответы (1)


Ваш синтаксис неверен: вы не можете использовать {{ ... }} внутри оператора {% ... %}.

Это должно работать, так как внутренний цикл for должен наследовать область действия внешнего цикла for:

{% for ruleset in rulesets %}
<div>{{ ruleset.0 }}</div>
<ul>
  {% for rule in rules %}
    # = is an assignment operator (which doesn't work in templates),
    # == is the equality operator, which you want to use.
    # alternatively you can use {% ifequal rule.0 ruleset.0 %}{% else %}{% endifequal %}
    {% if rule.0 == ruleset.0  %} 
      <li>{{ rule.1 }}</li>
    {% else %}
      <!-- Nothing -->
    {% endif %}
  {% endfor %}
</ul>
{% endfor %}
person knbk    schedule 26.03.2014
comment
вы также пропустите еще один тег {% endfor %} в конце внутреннего вложенного цикла - person Gabriel Amram; 27.03.2014
comment
@GabrielAmram Хороший улов. Просто скажите свой ответ, знаете ли вы, требуется ли forloop.parent для доступа к переменным в области родительского цикла for, или это просто способ доступа к родительскому циклу for counter, counter0 и т. д.? - person knbk; 27.03.2014
comment
@kbnk Это действительно нужно, чтобы получить counter0, counter и т. д., поэтому я удалил свой ответ, так как это не то, о чем изначально спрашивали. - person Gabriel Amram; 27.03.2014