7 февр. 2009 г.

Псевдорекурсия в шаблонах Django

Не первый раз уже сталкиваюсь с необходимостью создания деревьев на YUI. Прошлый раз дерево было тоже ненавязчивым, и как и прежде, я строил дерево из разметки. Но в прошлый раз данные для исходного ul строил хитрый sql скрипт использующий всю мощь oracle. В этот раз данные генерирует Django ORM, а значит и обрабатывать их надо по "джанговски".

Первый шаблон - итерация по списку категорий:

<div id="markup">
    <ul>
        {% for category in categorys %}
            <li>
                {% if category.parent %}
                {% else %}
                    {% include "category_intree.html" %}
                {% endif%}
            </li>
        {% endfor %}
    </ul>
</div>

Второй (вложенный) - итерация по вложенному списку категорий:

<a href="{% url category category.pk %}">{{ category }}</a>
{% ifnotequal category.child_category_count 0 %}
    <ul class="subcategory-list">
        {% for subcategory in categorys %}
            {% ifequal subcategory.parent category %}
                {% with subcategory as category %}
                    <li>{% include "category_intree.html"%}</li>
                {% endwith%}
            {% endifequal %}
        {% endfor %}
    </ul>
{% endifnotequal %}

Но, ведь, у дерева может быть несколько уровней. Вот для этого, как раз, во втором шаблоне красуется инструкция

{% with subcategory as category %}

которая переопределяет локальный "контекст" шаблона.

Фактически, имеем рекурсивный вызов вложенного шаблона. Код, конечно, далеко не идеален, но сама возможность создания таких штук очень радует.

Комментариев нет: