Вы могли использовать шаблон аккумулятора аргумента.
Большая дискуссия об этом здесь:
http://blogs.msdn.com/csharpfaq/archive/2004/03/11/87817.aspx
Как я вижу из вашего кода, вы правильно понимаете рекурсию, за исключением одного: он заменяет итерацию в операторе for, но не обновляет переменную ( категория
в вашем коде), изначально использовавшаяся в ней. Таким образом, вложенный цикл выполняет итерацию по дочерним элементам, но устанавливает поиск тегов
в исходной категории
, а не один передается в цикл loop ()
.
Я предлагаю изменить метод __ iter __ ()
, чтобы он возвращал self.items.iteritems ()
и шаблон на:
<saved_data>
{% for key, item in category recursive %}
{% if item.children %}
<category name="{{key}}">
{{ loop(item) }}
</category>
{% else %}
<item name="{{ key }}" value="{{ item }}" />
{% endif %}
{% endfor %}
</saved_data>